2011-06-22 41 views
12

我有一個函數設置一個計時器,並在計時器到期時自行回調。Javascript:可以在settimeout之前調用cleartimeout嗎?

我想知道的是,如果在函數頂部清除計時器是不好的做法。

原因是因爲我會不時異步調用該函數,如果我沒有先清除計時器,我會同時運行兩個計時器。

我意識到,我可以清除計時器之前,我讓另一個電話的功能,但我想知道如果它會導致任何瀏覽器的問題,如果我只是保持明暗調用函數內包含計時器。

一個其他的想法 - 我可以測試計時器變量之前進行cleartimeout調用,看看它是否是一個計時器?

下面是一些示例代碼:

function onAir(){ 

    // reset timer 
    clearTimeout(timer); 

    $.getJSON("http://mywebsite.com?format=json&callback=?",function(data){ 
     if(data.result == '1'){ 
      do stuff here 
     } 
     else{ 
      do other stuff here 
     } 
    }); 

    // start timer 
    timer = setTimeout("onAir()",60000); 
} 

感謝您與我分享你的大腦!

肯尼

+0

謝謝大家的快速解答!此外,謝謝你糾正我如何調用函數。學到了新東西! – Kenny

回答

14

是的,沒關係。此外,你應該叫 「的setTimeout()」 是這樣的:

timer = setTimeout(onAir, 60000); 
+0

我太遲了47秒.... – Neal

+6

c'est la vie ici :-) – Pointy

+2

懶惰的人:「c'est la vie ici」的意思是「那就是生活」。 –

4

是的,你可以調用clearTimeout上一個空變量,世界不會崩潰。

15

是的,你可以調用clearTimeout在null變量。

此外,我會建議你改變你的setTimeout所以它不會使用eval

timer = setTimeout(onAir,60000); 
+0

添加parens將執行onAir函數。只是通過參考就足夠了。 – thescientist

+0

@thescientist - 謝謝我忘記刪除'()' – Neal

0

清除超時不提出問題,我(但我不是一個javascript大師)。

順便說一句,你可以在這個線程發現野趣的東西(檢查現有超時):Check if a timeout has been cleared?

5

是的,你可以打電話clearTimeout(timer),但也有一些優勢情況下,它可能會導致問題。

如果timer先前已設置爲其他整數值,那麼您可能會關閉完全不相關的定時器。

setTimeout只是返回定時器的整數索引。如果定時器是否已經被預先設定的不確定的話,你可以調用clearTimeout之前增加一個檢查:

if (window.timer) 
{ 
    clearTimeout(timer); 
} 
... 
timer = setTimeout(onAir, duration); 

有解決的定時器變量可能的污染是使用封閉:

(function(){ 
    var timer, 
    duration; 
    duration = 60000; 
    window.onAir = function onAir(){ 
    ...code... 
    if (timer){ 
     clearTimeout(timer); 
    } 
    timer = setTimeout(onAir,duration); 
    }; 
}); 
+0

+1作爲關閉的例子,並提到邊緣情況下,非常重要的IMO – spirytus

相關問題