以下代码的目标是从命令行中指定的三个站点获取网页,并按命令行中指定的顺序显示它们。我的第一个解决方案(如下所示)是使用while循环等待三个异步任务完成但while循环保持循环永久。我了解到正确的解决方案是检测变量“count”是否在每个异步任务中达到3(也在下面显示但已注释掉),而不是在异步任务之外。但我想知道为什么我的初始解决方案不起作用。有人能指出我正确的Javascript规范,解释我的初始解决方案的缺陷吗?谢谢!
var http = require('http');
var bl = require('bl');
var url1 = process.argv[2];
var url2 = process.argv[3];
var url3 = process.argv[4];
var content1;
var content2;
var content3;
var count = 0;
http.get(url1, function (res) {
res.pipe(bl(function (err, data) {
content1 = data.toString();
count++;
// if (count == 3) printAll();
}));
});
http.get(url2, function (res) {
res.pipe(bl(function (err, data) {
content2 = data.toString();
count++;
// if (count == 3) printAll();
}));
});
http.get(url3, function (res) {
res.pipe(bl(function (err, data) {
content3 = data.toString();
count++;
// if (count == 3) printAll();
}));
});
function printAll() {
console.log(content1);
console.log(content2);
console.log(content3);
}
// this while loop loops forever
while (count < 3) {
console.log('waiting..');
};
printAll();
答案 0 :(得分:2)
setTimeout
与sleep
不同。这是一种在x毫秒内设置回调的方法。你将null作为回调传递,并在while
循环中无限循环,永远不会将线程放弃到http调用。
修改:我建议您查看async库以执行&#34;等待这三个回调完成&#34;。
答案 1 :(得分:0)
您可以使用使用setTimeout调用自身的递归函数来解决此问题:
(function loop() {
if (count < 3) {
setTimeout(loop, 1000);
console.log('waiting..');
} else {
printAll();
}
})();