ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript ES6 For ループで Promise をシリアル化する方法は?

JavaScript ES6 For ループで Promise をシリアル化する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 19:44:19299ブラウズ

How to Serialize Promises in a JavaScript ES6 For Loop?

JavaScript ES6 Promise For ループのシリアル化

指定されたコードで、for ループ内で Promise を順番に実行しようとしましたが、次の問題が発生しました。ループは同期的に実行されるため、予測不能な結果が生じます。 Output.

問題の理解:

Promise は非同期操作をカプセル化しますが、ループの同期的な性質により、必要なシーケンスを無視して、すべての Promise が同時にトリガーされます。

約束するsetTimeout:

順次実行を容易にするために、タイマーが期限切れになったときに解決される Promise を取得するように setTimeout を約束できます:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

ソリューション オプション:

この問題を解決するには、Promise と非同期プログラミングを活用する複数の方法があります。テクニック。

1.初期 Promise を含む For ループ:

すぐに解決される Promise から開始すると、前の Promise が解決されるにつれて後続の Promise を連鎖させることができます:

for (let i = 0, p = Promise.resolve(); i < 10; i++) {
  p = p
    .then(() => delay(Math.random() * 1000))
    .then(() => console.log(i));
}

2. Array.reduce と初期 Promise:

Array.reduce を使用すると、for ループ アプローチと同様の Promise チェーンを作成できます:

[...Array(10)]
  .reduce(
    (p, _, i) =>
      p.then(() => delay(Math.random() * 1000))
        .then(() => console.log(i)),
    Promise.resolve()
  );

3. Promise Resolution Callback としての関数:

それ自体を解決コールバックとして渡す関数を定義して、再帰的な Promise チェーンを可能にすることができます:

const loop = (i) => {
  delay(Math.random() * 1000)
    .then(() => console.log(i))
    .then(() => {
      if (i < 10) loop(i + 1);
    });
};
loop(0);

4。 async/await 構文 (ES2017):

ES2017 では、非同期コード処理を簡素化するために async/await 構文が導入されました:

const main = async () => {
  for (let i = 0; i < 10; i++) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
};
main();

5. for await...of 構文 (ES2020):

ES2020 では、非同期イテラブルを反復するための特別な構文が導入されました:

(async () => {
  for await (const i of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
})();

これらのテクニックを利用することで、Promise を順番に実行できます。ループ内で、操作の望ましい順序を確保し、予測できない出力を回避します。

以上がJavaScript ES6 For ループで Promise をシリアル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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