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

Javascript:在settimeout之前调用cleartimeout可以吗?,javascript,timer,Javascript,Timer,我有一个函数,可以设置计时器,并在计时器过期时调用它自己 我想知道的是,清除函数顶部的计时器是否是不好的做法 这是因为我会不时异步调用该函数,如果我不先清除计时器,我会让两个函数同时运行 我意识到我可以在对函数进行另一次调用之前清除计时器,但我想知道如果我只是将cleartimeout调用保留在包含计时器的函数中,是否会在任何浏览器中引起问题 还有一个想法——我可以在调用cleartimeout之前测试timer变量,看看它是否是计时器吗 下面是一些示例代码: function onAir(){

我有一个函数,可以设置计时器,并在计时器过期时调用它自己

我想知道的是,清除函数顶部的计时器是否是不好的做法

这是因为我会不时异步调用该函数,如果我不先清除计时器,我会让两个函数同时运行

我意识到我可以在对函数进行另一次调用之前清除计时器,但我想知道如果我只是将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);
} 
谢谢你和我分享你的想法


肯尼

是的,你可以在一个空变量上调用clearTimeout,世界就不会内爆。

是的,那很好。此外,您应该像这样调用“setTimeout()”:

  timer = setTimeout(onAir, 60000);

是的,您可以对
null
变量调用clearTimeout

另外,我建议您更改
设置超时
,这样它就不会使用
eval

timer = setTimeout(onAir,60000);

清除超时不会给我带来问题(但我不是javascript大师)


顺便说一句,您可以在这个线程上找到有趣的东西(检查现有超时):

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

添加参数将执行onAir函数。只需传递参考资料就足够了。谢谢大家的快速回答!另外,谢谢你纠正我调用函数的方式。在那里学到了一些新东西+1对于结束示例和边缘案例的提及,对于懒惰的案例非常重要:“c'est la vie ici”意味着“这就是生活”。