2016-04-15 64 views
1

你是否試圖設置一個超時來運行多個函數,它們之間有一些延遲?是for循環內的超時?您的功能是否都在同一時間觸發,不尊重超時,否則會導致混亂的行爲?如何在循環內設置Timeout

這是直觀的,但不正確的將它寫這樣的:

for (var i = 0; i < moves.length; i++) { 
    setTimeout(chooseOne(moves[i]), i * 1000 + 1000); 
} 

SOLUTION:

的解決方案是將I值間接地傳遞到超時,這樣的。編寫循環,在循環內調用你的超時函數,並將該函數傳遞給i值。

function clickedOne() { 
    for (var i = 0; i < moves.length; ++i) { 
     myTimeout(i); 
    } 
} 

然後在一個單獨的功能,設置超時時間,通過一個匿名函數作爲第一個參數,該函數我把我的chooseOne功能,通過它的獨特價值對於每次迭代裏面。現在你可以寫一個逗號,併爲你的超時setTimeout提供第二個參數。我的超時是我的一秒鐘,所以每個函數都會在它之前的一秒之後執行。

function myTimeout(i) { 
    setTimeout(function() { chooseOne(moves[i]); }, 1000 * i); 
} 

我實際上不知道這是爲什麼,第一種方法沒有。

+0

'moves.forEach(功能(移動,ⅰ){ 的setTimeout(函數(){ chooseOne(移動); } I * 1000 + 1000); } );' –

+1

http://stackoverflow.com/questions/5226285/settimeout-in-for-loop-does-not-print-consecutive-values –

+0

你能解釋一下Arun P Johny – PencilCrate

回答

-1

嘗試這種情況:

var i = 0; 
setTimeout(function(){ 
    if(i < moves.length){ 
     chooseOne(moves[i++]); 
    } 
}, i * 1000 + 1000); 
+1

這通過第一個值從數組添加到函數中,並將其正確放置在計時器上。但是,它不遍歷整個數組,但是沒有其他值被使用。 – PencilCrate

+0

更新了我的答案。 –