JavaScript 中For 循環內的非同步函數呼叫
JavaScript 的非同步特性可能會在for 迴圈中呼叫非同步函數時帶來挑戰。考慮以下程式碼:
for(var i = 0; i < list.length; i++){ mc_cli.get(list[i], function(err, response) { do_something(i); }); }
問題在於非同步回呼函數,該函數可能在 for 迴圈完成後執行。因此,do_something(i) 將始終引用迴圈的最終迭代。
嘗試使用閉包解決方案
開發人員嘗試使用閉包來捕獲i 的值在循環的每次迭代中:
do_something((function(x){return x})(i))
但是,這種方法也會失敗,因為函數立即執行,導致相同的問題。
使用 forEach
更有效的解決方案是利用 JavaScript 的 forEach 方法,該方法將數組項及其索引提供給回調函數。由於每個回呼都有自己的作用域,因此索引值會被保留。list.forEach(function(listItem, index){ mc_cli.get(listItem, function(err, response) { do_something(index); }); });透過使用 forEach,回調函數現在可以存取每次迭代的正確索引值,解決了索引不正確的問題在 do_something 函數中引用。
以上是如何處理 JavaScript For 迴圈中的非同步函數呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!