Javascript:在settimeout之前调用cleartimeout可以吗?

时间:2011-06-22 15:12:13

标签: javascript timer

我有一个设置计时器的函数,并在计时器到期时自行调用。

我想知道的是,如果清除功能顶部的计时器是不好的做法。

原因是因为我将不时地异步调用该函数,如果我不先清除定时器,我将同时运行两个。

我意识到我可以在我对该函数进行另一次调用之前清除定时器,但是我想知道如果我只是在包含定时器的函数内部保持cleartimeout调用它是否会导致任何浏览器出现问题。

另一个想法 - 我可以在进行cleartimeout调用之前测试timer变量,看看它是否是一个计时器?

以下是一些示例代码:

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);
} 

感谢您与我分享你的大脑!

肯尼

5 个答案:

答案 0 :(得分:17)

是的,没关系。此外,您应该像这样调用“setTimeout()”:

  timer = setTimeout(onAir, 60000);

答案 1 :(得分:17)

是的,您可以在null变量上调用clearTimeout。

另外我建议您更改setTimeout,以便它不会使用eval

timer = setTimeout(onAir,60000);

答案 2 :(得分:6)

是的,您可以致电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);
  };
});

答案 3 :(得分:4)

是的,您可以在null变量上调用clearTimeout,并且世界不会崩溃。

答案 4 :(得分:0)

清除超时不会给我带来任何问题(但我不是javascript专家)。

顺便说一句,你可以在这个帖子上找到有趣的东西(检查现有的超时):Check if a timeout has been cleared?