【问题标题】:NodeJs, Promises not waitingNodeJs,承诺不等待
【发布时间】:2017-04-21 23:17:33
【问题描述】:

我有这个函数应该对网页发出 300 个请求(用于基准测试),但是 Promise.all 在输出空数组之前不会等待这些请求完成,有什么想法吗?

function requestLoop(){

  var resultSet= [];

  // options.requests = 300
  // options.url = http://localhost/

  for(var c=1;c<=options.requests; c++){

    http.get(options.url, function(res){

    //  resultSet.push( { request: c, statusCode: res.statusCode});

      resultSet.push(new Promise(function(res){ return { request: c, statusCode: res.statusCode}; }));

    });

  }

  Promise.all(resultSet).then(function(){
    console.log(resultSet);
  });

  return;

}

Promise 是 bluebird,http 是普通的 http 包

【问题讨论】:

  • 您正在回调中创建承诺。当执行Promise.all(resultSet) 时,未创建任何承诺。
  • 我不同意,我没有使用 AJAX,而且这个问题只涉及一个请求,我正在尝试制作多个并将结果汇​​总在一起。
  • http.get 也返回承诺。你应该在数组中推送它!
  • 有没有例子说明这一点?

标签: javascript node.js promise


【解决方案1】:

Promise 在回调中被推送到数组中。因此,当Promise.all 调用时,数组为空([]

new Promise推入循环本身的数组中,而不是callback

function requestLoop() {
  var resultSet = [];
  for (var c = 1; c <= options.requests; c++) {
    (function(c) {
      resultSet.push(new Promise(function(resolve) {
        http.get(options.url, function(res) {
          resolve({
            request: c,
            statusCode: res.statusCode
          });
        });
      }));
    })(c);
  }
  Promise.all(resultSet).then(function() {
    console.log(resultSet);
  });
}

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 2021-11-26
    • 2020-05-17
    • 2017-10-24
    • 2019-04-29
    • 2022-11-26
    • 2019-12-10
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多