promise的解析顺序和Promise.settle中提到的顺序一样吗?

Is the resolution order of promises same as the order in which it is mentioned in Promise.settle?

在我 return 回复客户之前,我有 2 个承诺需要解决。

我正在使用蓝鸟。

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

promise 的解析顺序是什么?
在这种情况下,promise1() 总是首先解决吗?
如果不是,我们如何访问与 promise() 关联的结果?

不,就像在 .all() 中一样,所有操作都会同时调用*并且承诺会在任何时候解决。

然而,results 数组将始终按照原始数组的顺序排列,因此 results[0] 将是 promise1() 的结果。

* 他们一个接一个被调用,但我们不等第一个完成才开始第二个

在你的代码中,你的两个 promise 生成的函数被一个接一个地调用,它们将按照它们的自然时间导致它们完成的任何顺序完成。如果 promise2() 是一个非常快的异步操作,它可以在 promise1() 之前非常好地完成,因此将在另一个之前解决它的承诺。或者,反之亦然。换句话说,没有保证,因为它完全取决于每个异步操作的时间。当 运行 以这种方式进行异步操作时,您是 运行 它们并行(同时在飞行中)。

Promise.settle() 生成的结果数组将始终按最初指定的顺序排列,就像 Promise.all() 一样,因此 Promise.settle(...).then(function(results) {}) 结果数组中的第一项将始终属于 promise1() 和第二个 promise2().

注意:Promise.settle() 似乎已从最新版本的 Bluebird 中删除。您可以在每个生成的承诺上使用 .reflect() 来模拟此行为,如 here 所述。事实上,在最新版本的 Bluebird 中,您可以这样做:

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

在最新的 Bluebird 中,您可以制作自己的 Promise.settle() 与一系列承诺一起使用:

Promise.settle = function(array) {
    var reflects = [];
    if (array) {
        reflects = array.map(function(item) {
            // if it's a promise with .reflect(), call `.reflect()`
            if (typeof item.then === "function" && typeof item.reflect === "function") {
                return item.reflect();
            } else {
               // cast into a promise and call .reflect()
               return Promise.resolve(item).reflect();
            }
        });
    }
    return Promise.all(reflects);
}