2011-06-14 140 views
2

我想在每次迭代中延遲我的while循環。我試過如下:使用setTimeout延遲循環迭代

var o = 1; 
while(o<4){ 
    setTimeout("setupAnimation(o)",2000); 
    //setupAnimation(o); //<--this works but everything happens att the same time 
    o++; 
} 

我也試着寫這樣的,沒有工作之一:

var o = 1; 
function repeatMe(){ 
    setupAnimation(o); 
    o++; 
    setTimout('repeatMe()',1000); 
} 

有什麼建議?

回答

4

eval速度很慢,很難調試並且存在潛在的安全問題(取決於數據的來源)。不要使用它。 (將字符串傳遞給setTimeout通過代理使用eval

改爲將函數傳遞給setTimeout。您需要使用閉包來捕獲您傳遞的函數的當前值o

您應該也可以使用for循環而不是while循環。語法更清晰。

function setupAnimationFactory(o) { 
    return function() { 
     setupAnimation(o); 
    } 
} 

for (var o = 0; o < 4; o++){ 
    setTimeout(setupAnimationFactory(o),2000); 
} 
+2

除非我誤解了這一點,否則這隻會延遲整個事件2秒,而不是分隔每個電話。等同於只爲整個事情設置超時一次。我認爲這個問題意味着他想要將迭代排除在外。 – 2011-06-14 13:21:20

+0

呃,它可能會。 – Quentin 2011-06-14 13:25:30

0

您可以使用此:

setTimeout(function(){ myFunction(parameter)}, timeoutLength); 
+1

這是行不通的,因爲'o'在一個循環中,並且在任何超時命中0之前都會變爲最後的值。 – Quentin 2011-06-14 13:18:16

+0

是的,很好的一點。但是,我認爲,你可以在匿名函數的範圍內聲明一個變量來傳遞o作爲參數。 – Digbyswift 2011-06-14 13:22:00

2

試試這個:如果你想在這裏使用第二種方法

var o = 1; 
function repeatMe(){ 
    setupAnimation(o); 
    o++; 
    setTimeout(function(){repeatMe();},1000); 
} 

repeatMe(); 
1

是工作的Javascript

<script type="text/javascript"> 

    var o = 1; 
    function repeatMe(){ 

    setupAnimation(o); 
    o++; 

    setTimout(repeatMe(),1000); 
    } 

    function setupAnimation(o){ 
     alert(o); 
    } 

    </script> 

<a href='#' onclick="repeatMe()">Click Me</a> 
1
var o = 1; //Global Variable 
var animTimerId; //Global Variable 

function setupAnimation(o){ 
    // Your code goes here 

    o++; 
    if(o == 4){ 
    clearTimeout(animTimeoutId); 
    break; 
    } 
} 

function repeatMe(){ 
    animTimeoutId = setTimeout("setupAnimation(o)",2000); 
}