Bluebird中Promise.all()的动态数组

时间:2015-06-02 12:09:52

标签: javascript promise bluebird

我想将promises添加到动态传递给Promise.all()的数组

var P = require('bluebird');

var firstPromise = P.resolve().then(function () {
  console.log('1 completed');
});

var all = [firstPromise];

for (var i = 2; i < 5; i++) {
  (function closure(i) {
    setTimeout(function () {
      all.push(P.delay(1000).then(function () {
        console.log(i + ' completed');
      }));
    }, 0);
  })(i);

}

P.all(all).then(function () {
  console.log('finish');
});

输出

1 completed
finish
2 completed
3 completed
4 completed

我想在所有承诺得到解决之后打印完成。我知道我的代码不正确,但如何重写它来解决我的问题?

1 个答案:

答案 0 :(得分:0)

由于你的setTimeout,你在P.all电话后添加了承诺。

这不是承诺如何运作的。 在调用Promise.all之前,你必须推出所有承诺:

var all = [firstPromise];

for (var i = 2; i < 5; i++) {
  (function closure(i) {
    all.push(new P(function(resolve, reject) {
      setTimeout(function() {
        P.delay(1000).then(function () {
          console.log(i + ' completed');
        }).then(resolve).catch(reject);
      }, 0);
    }));
  })(i);
}

P.all(all).then(function () {
  console.log('finish');
});