2011-08-02 105 views
1

如何爲循環執行設定延遲的環路延遲在JavaScript

for(i=0; i<=10;i++){ 
     var s=i;//This line should execute for every 2 secs only 
     } 

如何給在Java腳本環路延遲....

我不希望像below..I想不使用的setTimeout ...

for(i=0; i<=10;i++){ 
     setTimeout("setvalue()",2000); //This alert should display for every 2 secs only 
     } 

     function setvalue() 
     { 
     var s=i; 
     } 

請幫我...

+1

所以你想要一個延遲,而不使用內置到JavaScript的確切功能來做一個延遲? –

+3

爲什麼**不要**你想使用'setTimeout'? – Matt

+0

如果您稱之爲睡眠,瀏覽器將凍結整個循環的持續時間。你確定你正確使用回調嗎?因爲你放置的代碼不起作用。 –

回答

8

使用setInterval()

var i = 0; 

var interval = setInterval(function(){ 
    setValue(); 
    i += 1; 

    if(i == 10) 
     clearInterval(interval); 
}, 2000); 

沒有辦法睡眠爲2秒,不會凍結整個瀏覽器。 Javascript是單線程的。

3

你不能。 JS在單個線程中運行,任何延遲該線程的嘗試都會凍結整個頁面。使用setTimeout是你唯一的選擇。

編輯:或setInterval;無論如何,沒有不毛茸茸的方式來表達「在這裏停止執行x毫秒」。

2

使用setTimeout是不可避免的,但是,遞歸函數可能是這一個更好的解決辦法:

var i=0; 
function recurs() { 
    i = s; 
    i++; 
    if (i <= 10) recurs(); 
} 

recurs(); 
1

正如其他人所指出的,setTimeout可以用來很好地處理這些類型的場景和setInterval可能也被使用但被某些人阻止。

您甚至可以遞歸調用一個內置setTimeout的函數,如MDN文檔setInterval中所述。標題中提到「危險用法」,但他們解決危險的方法是下面的代碼塊。

有它提到,有一個循環執行每x秒(或毫秒),那麼你可以做以下,並肯定知道該功能將只在一個時間和序列來執行一個:

(function loop(){ 
    setTimeout(function(){ 
     // logic here 

     // recurse 
     loop(); 

    }, 1000); // repeat loop 1 second after this branch has completed 
})(); 

如果您希望只執行有限的次數,那麼您可以在循環外創建一個變量,並且只有在計數小於要執行的次數時才遞歸執行。如:

var count = 0; 
(function loop() { 
    setTimeout(function() { 
     // logic 
     count++; 
     if (count < 10) { 
      loop(); 
     } 
    }, 1000); 
})();