Ответ 1
Да, это хорошо. Кроме того, вы должны называть "setTimeout()" следующим образом:
timer = setTimeout(onAir, 60000);
У меня есть функция, которая устанавливает таймер и вызывает себя по истечении таймера.
То, что я хотел бы знать, - это плохая практика очистки таймера в верхней части функции.
Причиной этого является то, что я буду асинхронно вызывать эту функцию время от времени, и если я сначала не очищу таймер, у меня будет два одновременных запуска.
Я понимаю, что я могу очистить таймер прямо перед тем, как сделать другой вызов функции, но мне интересно, вызовет ли это проблемы в любом браузере, если я просто сохраню вызов 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);
}
Спасибо, что поделились своим мозгом со мной!
Kenny
Да, это хорошо. Кроме того, вы должны называть "setTimeout()" следующим образом:
timer = setTimeout(onAir, 60000);
Да вы можете вызвать clearTimeout в переменной null
.
Также я предлагаю вам изменить свой setTimeout
, чтобы он не использовал eval
:
timer = setTimeout(onAir,60000);
Да, вы можете вызвать 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);
};
});
Да, вы можете вызвать clearTimeout для нулевой переменной, и мир не будет взорваться.
Устранение тайм-аута для меня не проблема (но я не гуру javascript).
Btw, вы можете найти intersting вещи (проверка существующего Timeout) в этом потоке: Проверить, очищен ли тайм-аут?