ホームページ >ウェブフロントエンド >jsチュートリアル >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 サイトの他の関連記事を参照してください。