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中文網其他相關文章!