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

Ken*_*nny 16 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);
} 
Run Code Online (Sandbox Code Playgroud)

谢谢你和我分享你的大脑!

肯尼

Poi*_*nty 17

是的,没关系.另外,你应该像这样调用"setTimeout()":

  timer = setTimeout(onAir, 60000);
Run Code Online (Sandbox Code Playgroud)

  • c'est la vie ici :-) (8认同)
  • 对于懒惰的人来说:"c'est la vie ici"的意思是"那是生命". (2认同)

Nea*_*eal 17

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

另外我建议你改变你setTimeout所以它不会使用eval:

timer = setTimeout(onAir,60000);
Run Code Online (Sandbox Code Playgroud)


zzz*_*Bov 6

是的,你可以打电话clearTimeout(timer),但有一些边缘情况可能会导致问题.

如果timer之前已经设置了一些其他整数值,那么你可能会杀死一个完全不相关的计时器.

setTimeout只返回计时器的整数索引.如果您不确定之前是否设置了计时器,可以在调用之前添加一个检查clearTimeout:

if (window.timer)
{
  clearTimeout(timer);
}
...
timer = setTimeout(onAir, duration);
Run Code Online (Sandbox Code Playgroud)

可能污染定时器变量的解决方案是使用闭包:

(function(){
  var timer,
    duration;
  duration = 60000;
  window.onAir = function onAir(){
    ...code...
    if (timer){
      clearTimeout(timer);
    }
    timer = setTimeout(onAir,duration);
  };
});
Run Code Online (Sandbox Code Playgroud)


Rob*_*ert 5

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