我有2个承诺应该在我向客户回复之前解决。
我正在使用蓝鸟。
Promise
.settle([prmoise1(), promise2()])
.then(function(results){
results.forEach(function(result){
if(result.isFulfilled()){
console.log(result);
}
});
});
承诺的解决顺序是什么?
在这种情况下,promise1()总是先解决吗?
如果没有,我们如何访问与promise()相关的结果?
答案 0 :(得分:3)
在你的代码中,你的两个promise生成的函数被一个接一个地调用,它们将按照它们的自然时间导致它们完成的任何顺序完成。如果promise2()
是一个非常快速的异步操作,它可能很好在promise1()
之前完成,因此会在另一个之前解决它的承诺。或者,反之亦然。换句话说,不能保证,因为它完全取决于每个异步操作的时间。以这种方式运行异步操作时,您将并行运行它们(同时在飞行中)。
Promise.settle()
生成的结果数组始终采用最初指定的顺序,就像Promise.all()
一样,因此Promise.settle(...).then(function(results) {})
结果数组中的第一项始终属于{{1} }和第二个promise1()
。
注意:promise2()
似乎已从最新版本的Bluebird中删除。您可以在每个生成的承诺上使用Promise.settle()
来模拟此行为,如here所述。事实上,在最新版本的Bluebird中,您可以这样做:
.reflect()
在最新的Bluebird中,您可以创建自己的Promise.all([promise1().reflect(), promise2().reflect()]).then(function(results){
results.forEach(function(result){
if(result.isFulfilled()){
console.log(result);
}
});
});
,其中包含一系列承诺:
Promise.settle()
答案 1 :(得分:2)
不,就像在.all()
中一样,所有动作都被同时调用*并且承诺会随时解决。
但是,results
数组将始终按照原始承诺数组的顺序排列,因此results[0]
将是promise1()
的结果。
*他们一个接一个地打电话,但我们不等第一个完成开始第二个