Promise.all:保留解析值的順序
Promise.all() 方法接受一個iterable 作為其參數並傳回一個新的一旦iterable 中的所有承諾都解決了,承諾就會解決。問題出現了:解析值的順序是否保證與可迭代中 Promise 的順序相符?
根據 MDN 文檔,解析值應該按照 Promise 的順序出現。然而,對這種特定行為的直接引用在規範中並沒有立即顯現出來。
深入研究規範,我們發現 PerformPromiseAll() 是透過傳遞給 Promise.all() 的可迭代物件來呼叫的。 PerformPromiseAll() 然後使用 IteratorStep() 迭代可迭代對象,這保證了 Promise 的順序。
此外,每個已解析的 Promise 都有一個內部 [[Index]] 槽,表示其在原始輸入可迭代物件中的索引。此槽在解析過程中使用,以確保輸出數組保持原始順序。
綜上所述,只要輸入,Promise.all() 中解析值的順序就會被嚴格保留iterable 是有序的。以下程式碼片段對此進行了範例:
<code class="js">const slow = new Promise(resolve => setTimeout(resolve, 200, 'slow')); const instant = 'instant'; const quick = new Promise(resolve => setTimeout(resolve, 50, 'quick')); Promise.all([slow, instant, quick]).then(responses => { responses.map(response => console.log(response)); }); // Output: [ 'instant', 'quick', 'slow' ]</code>
以上是`Promise.all()` 是否保留解析值的順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!