2013-02-16 85 views
0

我搜索了周圍,發現了一些其他類似的問題,但我似乎無法找到解決方案或明確的解釋。setTimeout在循環中:回調發生在它們之間沒有任何延遲

var content = 'test<br />'; 

for(var i = 1; i < 6; i++) { 
    setTimeout(function() { 
     document.write(content); 
    }, 3000); 
} 

我希望for循環中的代碼執行5次,每個循環之間有3秒的延遲。當它運行時,至少在表面上看起來像是頁面加載時的三秒延遲,然後毫不拖延地遍歷所有循環。

我錯過了什麼?

+5

將3秒與計數器相乘。另外請注意,如果在頁面加載後調用document.write – mplungjan 2013-02-16 18:59:29

+0

儘管javascript基於事件,但它有助於將'setTimeout'作爲觸發未來給定時間的事件,並將函數作爲參數提供爲該事件的處理程序(即使沒有創建事件對象)。 – 2013-02-16 19:01:33

+1

*每個*回調函數都會在循環運行時執行3秒*。 mplungjan建議在3,6,9等時間調度一個秒。 – 2013-02-16 19:02:04

回答

4

您的問題是,所有的電話都在3000毫秒後發生。請執行每次呼叫3秒分開執行此操作:

var content = 'test<br />'; 

for(var i = 1; i < 6; i++) { 
    setTimeout(function() { 
     document.write(content); 
    }, 3000 * i); 
} 
+0

謝謝。我選擇了這個答案,因爲它只需要改變我已經擁有的代碼。感謝所有在我的問題的評論中回答的人。 – Combobreaker 2013-02-16 19:19:20

2

您可能需要使用setInterval(因爲你正試圖在一定的‘區間’運行的代碼)

// first create an isolated namespace because we don't need to dirty the global ns // 
(function(){ 
    var counter = 0; 
    var maxIterations = 6; 
    var intervalReference = setInterval(function(){ 

    // your code goes here // 
    alert('test'); 

    // the stop condition // 
    ++counter; 
    if (counter == maxIterations) { 
     clearInterval(intervalReference); 
    } 
    }, 3000); 
}()) 
+1

不,沒有「可能需要」,雖然這是一個[複雜的方法] .. – 2013-02-16 19:05:36

0

setInterval不太可能去(見阿林的答案)的方式,但如果你是想要沿着setTimeout路線,代碼會看起來像這樣:

var loop = 0; 
var content = "test<br>"; 

function startTimeout(init){ 
    if(init!==true){ 
    document.write(content); 
    loop++; 
    } 

    if(loop<5){ 
    setTimeout(startTimeout, 3000); 
    } 
} 

startTimeout(true);