2016-12-24 182 views
1

比方說,我有當前代碼:For循環,保持可變

for(var n = 0; n != 5;n++){ 
    alert(i); 
} 

它會提醒0,1,2,3,4

雖然現在讓我們說我需要執行異步函數具有可以作爲參數傳遞的返回函數。

for(var n = 0; n != 5;n++){ 
    doAsync(function(){alert(n);}); 
} 

function doAsync(func){ 
    setTimeout(func, 1000); 
} 

這將提醒「5」,5次。有沒有辦法讓n變量和循環一樣?我的意思是我希望它執行0,1,2,3,4。

謝謝,我感謝所有幫助。

+2

使用'for'環或替代'.MAP內側的封閉件()'和'Promise.all()''用於循環for'。 – guest271314

回答

2

這是一個典型的關閉問題。

你可以改變你的代碼如下所示

for (var n = 0; n != 5; n++) { 
 
    alert(n); 
 
} 
 

 

 
for (var n = 0; n != 5; n++) { 
 
    doAsync(function(n) { 
 
    alert(n); 
 
    }.bind(null,n)); 
 
} 
 

 
function doAsync(func) { 
 
    setTimeout(func, 1000); 
 
}

希望這有助於

2

選項1:

for (var n = 0; n != 5; n++) { 
 
    (function(x) { 
 
    setTimeout(function() { 
 
     alert(x); 
 
    }, 1000); 
 
    })(n); 
 
}

選項2:

for (var n = 0; n != 5; n++) { 
 
    (function(x) { 
 
    doAsync(function() { 
 
     alert(x); 
 
    }); 
 
    })(n); 
 
} 
 

 
function doAsync(func) { 
 
    setTimeout(func, 1000); 
 
}