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

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

本文关键字:顺序 Promise 解决 是否 承诺 sexel      更新时间:2023-09-26

我有两个承诺,在我向客户端返回响应之前,应该先解决。

我在用蓝鸟。

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

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

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

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

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

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);
}

否,与.all()一样,所有操作都会同时调用*,并且承诺会在任何时候解析。

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

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