我有一个设置计时器的函数,并在计时器到期时自行调用。
我想知道的是,如果清除功能顶部的计时器是不好的做法。
原因是因为我将不时地异步调用该函数,如果我不先清除定时器,我将同时运行两个。
我意识到我可以在我对该函数进行另一次调用之前清除定时器,但是我想知道如果我只是在包含定时器的函数内部保持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);
}
感谢您与我分享你的大脑!
肯尼
答案 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?