Javascript 如何使用bluebirdjs按顺序链接承诺?
Promise.all()不能保证承诺会按顺序得到解决。如何做到这一点?最让我困惑的是,被链接的异步函数需要返回一个返回承诺的函数。下面是一个例子:Javascript 如何使用bluebirdjs按顺序链接承诺?,javascript,promise,chaining,chain,bluebird,Javascript,Promise,Chaining,Chain,Bluebird,Promise.all()不能保证承诺会按顺序得到解决。如何做到这一点?最让我困惑的是,被链接的异步函数需要返回一个返回承诺的函数。下面是一个例子: function setTimeoutPromise(ms) { return new Promise(function (resolve) { setTimeout(resolve, ms); }); } function foo(item, ms) { return function() { return setT
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()不会直接返回承诺
请看这个因为您使用的是Bluebird JS,所以实际上可以用一种简单的方法来完成 在版本2.0中,Bluebird引入了
承诺。每个实现这一点的方法对于循环a来说都足够简单,但由于它非常常见,并且一次又一次地被请求,最终它被添加为自己的方法
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在迭代中执行优化 为什么要返回一个chain.then()
当这样调用then()
时,它实际上除了复制承诺之外什么都不做。Benjamin的例子显然更简单。我在处理PockDB中的lie promise lib()时开发了我的,在这种情况下,不支持each()调用。我的问题真的应该引用liejs,而不是bluebirdjs:)。@BenjaminGruenbaum否则你会如何使用我的代码来链接这些承诺?我仍在学习承诺的细微差别,因此我非常感谢您的意见。退货链
而不是退货链。然后()
是的,错过了那一条:)