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(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中文網其他相關文章!