Подтвердить что ты не робот

Javascript: Можно ли вызывать cleartimeout перед настройкой?

У меня есть функция, которая устанавливает таймер и вызывает себя по истечении таймера.

То, что я хотел бы знать, - это плохая практика очистки таймера в верхней части функции.

Причиной этого является то, что я буду асинхронно вызывать эту функцию время от времени, и если я сначала не очищу таймер, у меня будет два одновременных запуска.

Я понимаю, что я могу очистить таймер прямо перед тем, как сделать другой вызов функции, но мне интересно, вызовет ли это проблемы в любом браузере, если я просто сохраню вызов 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

4b9b3361

Ответ 1

Да, это хорошо. Кроме того, вы должны называть "setTimeout()" следующим образом:

  timer = setTimeout(onAir, 60000);

Ответ 2

Да вы можете вызвать clearTimeout в переменной null.

Также я предлагаю вам изменить свой setTimeout, чтобы он не использовал eval:

timer = setTimeout(onAir,60000);

Ответ 3

Да, вы можете вызвать 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);
  };
});

Ответ 4

Да, вы можете вызвать clearTimeout для нулевой переменной, и мир не будет взорваться.

Ответ 5

Устранение тайм-аута для меня не проблема (но я не гуру javascript).

Btw, вы можете найти intersting вещи (проверка существующего Timeout) в этом потоке: Проверить, очищен ли тайм-аут?