【问题标题】:How to wait until a callback is fully finished?如何等到回调完全完成?
【发布时间】:2016-02-17 10:14:29
【问题描述】:

我有以下循环发出 10 个请求。 console.log 将从 1 打印到 10。如何修改此代码以仅打印出 peopleProfile (10) 的最终长度?

for (var i = 0; i < 10; i++) {
  request(URL, function(err, response, body) {
    if (err) {
      console.log(err);
    }
    if (!err && response.statusCode == 200) {
      peopleProfile.push(body);
      console.log(peopleProfile.length);
    }
  });
}

【问题讨论】:

  • 你不能做异步和循环,你基本上是同时做10个请求,而不是顺序。
  • 你能指出一个更好的方法来解决这个问题吗?我想发出 10 个请求并将每个请求的响应存储到 peopleProfile
  • 我的目标是像sequence(range(1,10).map(request(url)) 这样request(url) 返回一个promise,sequence 接受一个promise 数组并按顺序运行它们。
  • 对使用promises有异议吗?
  • 您可以统计已解决的请求和被拒绝的请求,并检查总和何时达到 10

标签: javascript node.js


【解决方案1】:

你可以使用 Bluebird - 一个承诺库

var promises = [];
for (var i = 0; i < 10; ++i) {
    promises.push(requestAsync(url));
}
Promise.all(promises).then(function() {
    console.log("print this after finishing 10 requests");
});

【讨论】:

  • 这正是我在评论中所说的!我只是没有精力发布解决方案!
【解决方案2】:

你不能这样做有什么原因吗?

var completedRequests = 0;

for (var i = 0; i < 10; i++) {
  request(URL, function(err, response, body) {
    completedRequests++;
    if (err) {
      console.log(err);
    }
    if (!err && response.statusCode == 200) {
      peopleProfile.push(body);
      if (completedRequests === 10) {
        console.log(peopleProfile.length);
      }
    }
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2021-11-13
    相关资源
    最近更新 更多