【发布时间】:2014-08-16 08:23:02
【问题描述】:
Promise.all() 不保证承诺会按顺序解决。如何做到这一点?
【问题讨论】:
标签: javascript promise chaining chain bluebird
Promise.all() 不保证承诺会按顺序解决。如何做到这一点?
【问题讨论】:
标签: javascript promise chaining chain bluebird
由于您使用的是 Bluebird JS,这实际上可以通过简单的方式完成。
在 2.0 版中,Bluebird 引入了执行此操作的 Promise.each 方法,因为循环 a then 很简单,但由于它非常常见并且一次又一次地被请求,最终它被添加为自己的方法。
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 对迭代执行优化。
【讨论】:
最让我困惑的是,被链接的异步函数需要返回一个返回承诺的函数。这是一个例子:
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 返回一个返回承诺的函数。 foo() 确实不直接返回一个承诺。
看到这个Live Demo
【讨论】:
then() 被这样调用时,你为什么要返回chain.then(),它实际上除了复制承诺之外什么都不做。
return chain 而不是 return chain.then()