[英]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.