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