ホームページ > 記事 > ウェブフロントエンド > `Promise.all()` は解決された値の順序を保証しますか?
Promise.all() メソッドは、複数の Promise の同時実行と解決を可能にし、開発者に非同期プログラミングのための強力なツールを提供します。 。 Promise.all() の結果配列内の解決された値の順序に関して、興味深い疑問が生じます。
Mozilla Developer Network (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]] スロットがあり、元の iterable 内での位置を示します。
その結果、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 の順序に合わせて、「slow」、「instant」、「quick」の順序で表示されます。
以上が`Promise.all()` は解決された値の順序を保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。