JavaScript For ループ内の非同期プロセス
JavaScript では、for ループが非同期で実行され、コールバックを操作するときに予期しない結果が生じる可能性があります。次の例を考えてみましょう:
var i; var j = 10; for (i = 0; i < j; i++) { asynchronousProcess(callbackFunction() { alert(i); }); }
このコードは、0 から 10 までの番号でアラートを表示することを目的としています。ただし、ループの非同期の性質により、複数のループ反復が発生した後にコールバック関数がトリガーされる可能性があります。その結果、i の値が大きくなります。
解決策
この問題を解決するには、各コールバックのクロージャでループのインデックスをキャプチャすることが重要です。これはいくつかの方法で実現できます。
someArray.forEach(function(item, i) { asynchronousProcess(function(item) { console.log(i); }); });
var j = 10; for (var i = 0; i < j; i++) { (function(cntr) { // Capture the value of `i` into `cntr` asynchronousProcess(function() { console.log(cntr); }); })(i); }
var j = 10; for (var i = 0; i < j; i++) { asynchronousProcess(i, function(cntr) { console.log(cntr); }); }
const j = 10; for (let i = 0; i < j; i++) { asynchronousProcess(function() { console.log(i); }); }
async function someFunction() { const j = 10; for (let i = 0; i < j; i++) { // Wait for previous promise to resolve before proceeding await asynchronousProcess(); console.log(i); } }
function someFunction() { let promises = []; for (let i = 0; i < 10; i++) { promises.push(asynchronousProcessThatReturnsPromise()); } return Promise.all(promises); } someFunction().then(results => { // Array of results in order console.log(results); }).catch(err => { console.log(err); });
以上がJavaScript For ループで非同期プロセスを使用するときに予期しない結果を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。