在你的代碼,你的兩個承諾產生的函數被調用了一個又一個,他們將按其固有時間順序完成的任何順序完成。如果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.10.2 – Raj
@HurricaneHamilton - 'Promise.settle()'在最新版本的Bluebird中被刪除(令我失望)。顯然,你必須使用'.reflect()'來模擬我們用'Promise.settle()'完成的工作。 – jfriend00