ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript For ループ内で非同期関数を適切に処理するにはどうすればよいですか?

JavaScript For ループ内で非同期関数を適切に処理するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-03 02:15:291051ブラウズ

 How to Properly Handle Asynchronous Functions Inside JavaScript For Loops?

JavaScript for ループ内での非同期関数の呼び出し

JavaScript for ループ内で非同期関数を使用する場合、非同期実行と変数のスコープに関連する問題が発生する可能性があります。

次のコードを考えてみましょう。

for (var i = 0; i < list.length; i++) {
  mc_cli.get(list[i], function (err, response) {
    do_something(i);
  });
}

この例では、mc_cli.get は、操作の完了時にコールバック関数を呼び出す非同期関数です。ただし、コールバックは非同期であるため、for ループがすでに終了した後に実行される可能性があり、誤った動作が発生する可能性があります。

コールバック内から do_something 関数を使用すると、別の問題が発生します。変数 i はループ変数であるため、その値はループの実行中に変化します。したがって、 do_something(i) はループ内の i の最後の値を常に使用しますが、これは望ましい動作ではありません。

これらの問題を解決するための一般的なアプローチの 1 つは、クロージャを使用することです。クロージャを使用すると、変数の周囲に新しいスコープを作成し、非同期操作全体を通じてその値の一貫性を確保できます。ただし、この例では、クロージャが正しく実装されていません。

正しい実装は、i:

for (var i = 0; i < list.length; i++) {
  (function (i) {
    mc_cli.get(list[i], function (err, response) {
      do_something(i);
    });
  })(i);
}
この場合、内部関数は独自のスコープを持ち、外側のループから i の値にアクセスできます。ただし、mc_cli.get が呼び出される前に外側のループが完了する必要があることに注意することが重要です。そうしないと、依然として問題が発生する可能性があります。

あるいは、リスト項目を提供する配列に対して forEach メソッドを使用することもできます。コールバック内のインデックスにより、クロージャーの必要性が完全に排除されます:

以上がJavaScript For ループ内で非同期関数を適切に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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