Javascript:为什么我不能等待异步任务完成使用while循环?

时间:2016-05-25 15:18:22

标签: javascript asynchronous

以下代码的目标是从命令行中指定的三个站点获取网页,并按命令行中指定的顺序显示它们。我的第一个解决方案(如下所示)是使用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();

2 个答案:

答案 0 :(得分:2)

setTimeoutsleep不同。这是一种在x毫秒内设置回调的方法。你将null作为回调传递,并在while循环中无限循环,永远不会将线程放弃到http调用。

修改:我建议您查看async库以执行&#34;等待这三个回调完成&#34;。

答案 1 :(得分:0)

您可以使用使用setTimeout调用自身的递归函数来解决此问题:

(function loop() {
   if (count < 3) {
       setTimeout(loop, 1000);
       console.log('waiting..');
   } else {
       printAll();
   }
})();