2010-09-30 40 views
0

我有一個計時器以10秒爲間隔在我的頁面上。它使用setTimeout(「myWork()」,10000)創建。它完美的作品。在某些情況下,根據某些條件,我會清除此間隔並創建一個新的間隔,間隔爲1秒。Chrome上的JavaScript clearTimeout問題

var tenSecTimer = 0; 

if (myCondition) 
{ 
    clearTimeout(tenSecTimer); 
    tenSecTimer = setTimeout("myWork()", 1000); 
} 

這整個過程在所有版本的IE和FireFox上都能正常工作。當我在Chrome(6.0)中打開此頁面時,在clearTimeout被調用後,ticker停止工作。它永遠不會識別1s計時器。

我缺少最新的鉻?

感謝

+0

myWork是一個全局函數嗎? – methodin 2010-09-30 13:22:32

回答

0

不是一個答案,但完整的代碼表現出相同的行爲:

(function() { 
var counter = 0; 

function testCounter() { 
    if (counter === 2) { 
    clearInterval (timer); 
    timer = setInterval (myWork, 1000); 
    } 

    else if (counter === 5) 
    clearInterval (timer); 
} 

function myWork() { 
    document.body.innerHTML += ++counter + ' ' + Date() +'<br/>'; 
} 

document.body.innerHTML += 'Starting ' + Date() +'<br/>'; 
var timer = setInterval (myWork, 10000); 
setInterval (testCounter, 500); 
})(); 

此代碼顯示:

Starting Thu Sep 30 2010 16:15:09 GMT+0200 (CEST) 
1 Thu Sep 30 2010 16:15:19 GMT+0200 (CEST) 
2 Thu Sep 30 2010 16:15:29 GMT+0200 (CEST) 

,並沒有更多的,如果我刪除的setInterval上testCounter並在myWork中調用它我得到以下內容:

Starting Thu Sep 30 2010 16:20:50 GMT+0200 (CEST) 
1 Thu Sep 30 2010 16:21:00 GMT+0200 (CEST) 
2 Thu Sep 30 2010 16:21:10 GMT+0200 (CEST) 
3 Thu Sep 30 2010 16:21:11 GMT+0200 (CEST) 
4 Thu Sep 30 2010 16:21:12 GMT+0200 (CEST) 
5 Thu Sep 30 2010 16:21:13 GMT+0200 (CEST) 

非常好奇.....

+0

P.S.如果使用重新觸發的setTimeout而不是setInterval,我會得到相同的結果。 – HBP 2010-09-30 14:44:18

+0

PPS:我解決了我的代碼問題:計數器值爲2時,testCounter不斷觸發並清除/設置myWork的setInterval,因此從未觸發。我懷疑ByteBlocks有類似的情況。 – HBP 2010-09-30 14:44:51

+0

這是我們曾考慮採取的解決方法之一。但我很好奇爲什麼會發生這種情況。與瀏覽器內部的某種競爭情況有關,因爲下一次來電會導致以前的回撥被中斷? 1s tick對於這種行爲來說並不是太快。 – ByteBlocks 2010-09-30 17:27:51

0

我懷疑這會解決它,但你試過路過的參考,而不是一個字符串進行評估?

setTimeout(myWork, 1000) 
+0

如果是這種情況,它也不適用於10秒間隔計時器。它只在我清除計時器並重新創建1秒時停止。 – ByteBlocks 2010-09-30 13:14:31

+0

你可以發佈* full *代碼,包括'myWork'功能嗎? – 2010-09-30 13:16:16

0

我不知道你的代碼的其餘部分的樣子,但你可能使用的setInterval()代替setTimeout()會更好。簽名模式相同,但setInterval自動處理重複。

1

爲什麼不使用這個?

var tenSecTimer = 0; 

if (myCondition) { 
    clearTimeout(tenSecTimer); 
    tenSecTimer = setTimeout(function() { 
     myWork(); 
    }, 1000); 
} 

注意:它傳入一個函數,然後執行myWork函數。使用setTimeout或setInterval字符串很糟糕,因爲它然後調用eval(這很慢,並且有其他問題)。

Source (scroll all the way to the bottom)

0

我想我已經解決了這個問題的奧祕。從韓的評論中得到啓發,我意識到實際的代碼在做什麼。我有一個1s時鐘定時器,它產生了清除10s定時器,然後爲「myWork」啓動1s定時器的條件。在喚醒1s計時器之前,另一個時鐘發生了。現在清除了正在等待「myWork」的計時器。所以它幾乎進入了一個永無止境的循環。看起來Chrome的定時器已經變得非常有效了:-)解決這個問題的關鍵是要麼將「myWork」的定時器設置爲小於1s,要麼有一個狀態機來確保定時器在其之前未被清除已執行。