ホームページ  >  記事  >  ウェブフロントエンド  >  `Promise.all()` は解決された値の順序を保証しますか?

`Promise.all()` は解決された値の順序を保証しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 05:40:02874ブラウズ

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

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() での順序の保持

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。