首頁 > web前端 > js教程 > 主體

`Promise.all()` 是否保證解析值的順序?

Mary-Kate Olsen
發布: 2024-11-03 05:40:02
原創
869 人瀏覽過

Does `Promise.all()` Guarantee the Order of Resolved Values?

Promise.all:解析值的順序

Promise.all() 方法支援並發執行和解析多個Promise,為開發人員提供了強大的非同步編程工具。關於 Promise.all() 結果數組中解析值的順序,出現了一個有趣的問題。

根據 Mozilla 開發者網路 (MDN),從 Promise 的 .then() 回調所獲得的結果。 all() 似乎按照與輸入 Promise 相同的順序排序。例如:

var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve);
return Promise.all(somePromises).then(function(results) {
  console.log(results) //  is [1, 2, 3, 4, 5] the guaranteed result?
});
登入後複製

Promises 規範保證這種行為嗎?讓我們深入研究技術細節來找出答案。

在 Promise.all() 中保留順序

在 Promise.all(iterable) 方法中,iterable 表示 Promise 的集合。 PerformPromiseAll(iterator, constructor, resultCapability) 函數在內部調用,使用 IteratorStep(iterator) 迭代可迭代物件。

當 Promise 以解析值結算時,將呼叫 Promise.all() Resolve。每個已解決的 Promise 都帶有一個內部 [[Index]] 槽,表示其在原始可迭代中的位置。

因此,Promise.all() 的輸出保持嚴格的順序,與中 Promise 的順序相對應。輸入可迭代。只要提供的可迭代物件是嚴格有序的,例如數組,這一點就成立。

順序保存示範

下面是一個實際範例,說明了Promise.all() 中的順序保存:

<code class="javascript">// Used to display results
const write = msg => {
  document.body.appendChild(document.createElement('div')).innerHTML = msg;
};

// Different speed async operations
const slow = new Promise(resolve => {
  setTimeout(resolve, 200, 'slow');
});
const instant = 'instant';
const quick = new Promise(resolve => {
  setTimeout(resolve, 50, 'quick');
});

// The order is preserved regardless of what resolved first
Promise.all([slow, instant, quick]).then(responses => {
  responses.map(response => write(response));
});</code>
登入後複製

在這種情況下,「即時”值立即解析,然後是“快”和“慢”。但是,根據 Promise.all() 中的順序保留,結果將按以下順序顯示:“慢”、“即時”、“快”,與輸入數組中 Promise 的順序對齊。

以上是`Promise.all()` 是否保證解析值的順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板