2015-12-15 99 views
2

我有2個承諾,應在我向客戶返回響應之前解決。承諾的解決順序與Promise.settle中提到的順序相同嗎?

我正在使用藍鳥。

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

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

+0

你使用什麼版本的藍鳥?我在文檔中看不到安逸。 –

+0

我正在使用版本2.10.2 – Raj

+1

@HurricaneHamilton - 'Promise.settle()'在最新版本的Bluebird中被刪除(令我失望)。顯然,你必須使用'.reflect()'來模擬我們用'Promise.settle()'完成的工作。 – jfriend00

回答

3

在你的代碼,你的兩個承諾產生的函數被調用了一個又一個,他們將按其固有時間順序完成的任何順序完成。如果promise2()是非常快速的異步操作,則它可能在promise1()之前非常完整,因此可以在另一個之前解決它的承諾。或者,反之亦然。換句話說,沒有保證,因爲它完全取決於每個異步操作的時間。當以這種方式運行異步操作時,您可以並行運行它們(同時在飛行中)。

結果陣列Promise.settle()生成總是會在原先指定的順序,正如與Promise.all()所以Promise.settle(...).then(function(results) {})結果陣列中的第一項將總是屬於promise1()和第二至promise2()

注意:Promise.settle()似乎已從最新版本的Bluebird中刪除。您可以在每個生成的承諾上使用.reflect()來模擬here中描述的行爲。事實上,在藍鳥的最新版本,你可以這樣做:

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

在最新的藍鳥,你可以讓自己的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); 
} 
2

不,像.all()一樣,所有操作都是同時調用的*,並且承諾每次都解析。

但是,results數組將始終按原始承諾數組的順序排列,因此results[0]將是promise1()的結果。

*他們叫了一個又一個,但我們不等待第一個完成啓動第二