承诺的解决顺序是否与Promise.settle中提到的顺序相同?

时间:2015-12-15 20:27:43

标签: javascript node.js promise bluebird

我有2个承诺应该在我向客户回复之前解决。

我正在使用蓝鸟。

Promise
    .settle([prmoise1(), promise2()])
    .then(function(results){
        results.forEach(function(result){
           if(result.isFulfilled()){
             console.log(result);
           }
        });
    });

承诺的解决顺序是什么?
在这种情况下,promise1()总是先解决吗? 如果没有,我们如何访问与promise()相关的结果?

2 个答案:

答案 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()的结果。

*他们一个接一个地打电话,但我们不等第一个完成开始第二个