Promise.all()并不保证承诺将按顺序得到解决。怎么办呢?
答案 0 :(得分:8)
由于您正在使用Bluebird JS,这实际上可以通过简单的方式完成。
在2.0版本中,Bluebird引入了Promise.each
方法来执行此操作,因为循环a非常简单,但由于它非常常见并且一次又一次地请求,最终它被添加为自己的方法。 / p>
function foo(item, ms){ // note bluebird has a delay method
return Promise.delay(ms, item).then(console.log.bind(console))
}
var items = ['one', 'two', 'three'];
Promise.each(items, function(item, i){
return foo(item, (items.length - i) * 1000)
});
与其他答案产生的结果相同,只有较少的代码行,并且Bluebird还可以对迭代执行优化。
答案 1 :(得分:0)
最让我困惑的是,链接的异步函数需要返回一个返回promise的函数。这是一个例子:
function setTimeoutPromise(ms) {
return new Promise(function (resolve) {
setTimeout(resolve, ms);
});
}
function foo(item, ms) {
return function() {
return setTimeoutPromise(ms).then(function () {
console.log(item);
});
};
}
var items = ['one', 'two', 'three'];
function bar() {
var chain = Promise.resolve();
items.forEach(function (el, i) {
chain = chain.then(foo(el, (items.length - i)*1000));
});
return chain;
}
bar().then(function () {
console.log('done');
});
请注意,foo返回一个返回promise的函数。 foo()不直接返回承诺。
请参阅此Live Demo