我想将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
我想在所有承诺得到解决之后打印完成。我知道我的代码不正确,但如何重写它来解决我的问题?
答案 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');
});