簡體   English   中英

Promise的解決順序是否與Promise.settle中提到的順序相同?

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

我有2個應答應兌現,然后再返回給客戶。

我正在使用藍鳥。

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

承諾的解決順序是什么?
在這種情況下是否總是先解決promise1()?
如果不是,我們如何訪問與promise()相關的結果?

在您的代碼中,兩個promise生成的函數將被一個接一個地調用,它們將以自然定時使它們完成的任何順序完成。如果promise2()是一個非常快速的異步操作,它很可能在promise1()之前完成這樣做並因此將在另一方面前解決它的承諾。 或者,反之亦然。 換句話說,不能保證,因為它完全取決於每個異步操作的時間。 當以這種方式運行異步操作時,您將並行運行它們(同時在運行中)。

Promise.settle()生成的結果數組將始終按照最初指定的順序,就像Promise.all()一樣,因此Promise.settle(...).then(function(results) {})的第一項結果數組將始終屬於promise1() ,第二個數組屬於promise2()

注意: Promise.settle()似乎已從最新版本的Bluebird中刪除。 您可以使用.reflect()上的每個geneated承諾所描述的模擬這種行為在這里 實際上,在最新版本的Bluebird中,您可以這樣做:

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

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

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() ,所有動作都被同時調用*,並且promise會在任何時候解析。

但是, results數組將始終按原始promises數組的順序進行,因此results[0]將是promise1()的結果。

*他們被一個接一個地稱呼,但我們不必等到第一個開始就開始第二個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM