【发布时间】:2015-04-06 03:37:16
【问题描述】:
我正在尝试通过 nodeschool 的 learnyounode。
这个问题和上一个问题(HTTP COLLECT)一样 你需要使用 http.get()。然而,这一次你将 提供三个 URL 作为前三个命令行参数。
您必须收集每个网站提供给您的完整内容 URL 并将其打印到控制台 (stdout)。你不需要打印出来 长度,只是作为字符串的数据;每个 URL 一行。问题是 您必须按照与 URL 相同的顺序打印出来 作为命令行参数提供给您。
我很困惑为什么我的解决方案不能完全正常工作,因为它对我来说看起来一样,但功能更强大,并且不确定它们的内部测试工作原理:
1. ACTUAL: ""
1. EXPECTED: "As busy as a dead horse also lets get some dero. Built like a sleepout no dramas lets get some chook. She'll be right thingo my she'll be right ute. "
2. ACTUAL: "She'll be right bizzo no worries she'll be right fair dinkum. We're going aerial pingpong no worries as busy as a gyno. "
2. EXPECTED: "She'll be right bizzo no worries she'll be right fair dinkum. We're going aerial pingpong no worries as busy as a gyno. "
3. ACTUAL: "He's got a massive pretty spiffy heaps she'll be right brizzie. He hasn't got a fly wire where shazza got us some strewth. She'll be right spit the dummy with it'll be fair go. We're going gobsmacked with as stands out like arvo. He's got a massive bush bash mate she'll be right slacker. "
3. EXPECTED: "He's got a massive pretty spiffy heaps she'll be right brizzie. He hasn't got a fly wire where shazza got us some strewth. She'll be right spit the dummy with it'll be fair go. We're going gobsmacked with as stands out like arvo. He's got a massive bush bash mate she'll be right slacker. "
4. ACTUAL: ""
4. EXPECTED: ""
我的代码:
var http = require('http');
var bl = require('bl');
var result = [];
var urls = process.argv.slice(2);
urls.forEach(function(url, i) {
http.get(url, function(response) {
response.pipe(bl(function(err, data) {
if (err) return console.error(err);
result[i] = data.toString();
if (i === urls.length - 1) {
console.log(result.join('\n'));
}
}));
});
});
官方解决方案:
var http = require('http')
var bl = require('bl')
var results = []
var count = 0
function printResults () {
for (var i = 0; i < 3; i++)
console.log(results[i])
}
function httpGet (index) {
http.get(process.argv[2 + index], function (response) {
response.pipe(bl(function (err, data) {
if (err)
return console.error(err)
results[index] = data.toString()
count++
if (count == 3)
printResults()
}))
})
}
for (var i = 0; i < 3; i++)
httpGet(i)
基本上第一个测试永远不会通过(尽管如果迭代数组中只有 1 个 url(而不是 3 个),则第一个测试通过但其他测试不通过)。任何见解都会很棒。我不知道在哪里问这个问题,也许我只是错过了一些 JS 的东西,如果这不合适,很抱歉。
【问题讨论】:
-
当您异步进行下载时,您也在尝试异步打印它们。只有在知道下载已完成后,您才应该进行打印。正如@mrmcgreg 指出的那样,演示代码一直等到计数达到 3,然后才决定打印结果。他们所做的最大区别在于,它们仅在将
data分配给结果后才增加计数。
标签: javascript node.js