2011-06-22 12 views
12

Mam funkcję, która ustawia licznik czasu i wywołuje się z powrotem po wygaśnięciu licznika czasu.JavaScript: Czy można wywołać funkcję cleartimeout przed rozliczeniem?

Chciałbym wiedzieć, czy złą praktyką jest czyszczenie timera na górze funkcji.

Powodem tego jest to, że będę wywoływał tę funkcję asynchronicznie od czasu do czasu, a jeśli nie usunę najpierw licznika czasu, będę miał dwa działające jednocześnie.

Zdaję sobie sprawę, że mogę wyczyścić licznik czasu, zanim wykonam drugie wywołanie funkcji, ale zastanawiam się, czy spowoduje to problemy w dowolnej przeglądarce, jeśli po prostu zatrzymam wywołanie funkcji cleartimeout wewnątrz funkcji zawierającej timer .

Jedna inna myśl - czy mogę przetestować zmienną licznika przed wykonaniem połączenia bezczeszczenia, aby sprawdzić, czy jest to timer?

Oto przykładowy kod:

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); 
} 

Dzięki za podzielenie się ze mną mózg!

Kenny

+0

Dziękuję wszystkim za szybkie odpowiedzi! Ponadto, dziękuję za poprawienie sposobu w jaki wzywam funkcję. Nauczyłem się czegoś nowego! – Kenny

Odpowiedz

14

Tak, w porządku. Ponadto, należy zadzwonić "setTimeout()" tak:

timer = setTimeout(onAir, 60000); 
+0

byłem 47 sekund za późno .... – Neal

+6

c'est la vie ici :-) – Pointy

+2

dla leniwych: "c'est la vie ici" znaczy "To jest życie". –

4

Tak można nazwać clearTimeout o zmiennej wartości null, a świat nie będzie implozji.

15

Tak można nazwać clearTimeout o zmiennej null.

Także proponuję zmienić swoje setTimeout więc nie użyje eval:

timer = setTimeout(onAir,60000); 
+0

dodanie parens spowoduje wykonanie funkcji onAir.wystarczy podanie odniesienia. – thescientist

+0

@thescientist - dziękuję zapomniałem usunąć '()' – Neal

0

Usuwanie Timeout nie budzi wątpliwości do mnie (ale nie jestem javascript guru).

Btw, można znaleźć rzeczy ciekawych (sprawdzanie istniejącego timeout) na tym wątku: Check if a timeout has been cleared?

5

Tak można nazwać clearTimeout(timer), ale istnieją pewne przypadki brzegowe gdzie może to spowodować problemy.

Jeśli wcześniej ustawiono timer z inną wartością całkowitą, możliwe, że zabijamy całkowicie niepowiązany zegar.

setTimeout po prostu zwraca wartość całkowitą dla licznika czasu. Jeśli nie jesteś pewien, czy zegar został ustawiony poprzednio, można dodać sprawdzenie przed wywołaniem clearTimeout:

if (window.timer) 
{ 
    clearTimeout(timer); 
} 
... 
timer = setTimeout(onAir, duration); 

Rozwiązaniem ewentualnego zanieczyszczenia zmiennej timera jest użycie Zamknięcie:

(function(){ 
    var timer, 
    duration; 
    duration = 60000; 
    window.onAir = function onAir(){ 
    ...code... 
    if (timer){ 
     clearTimeout(timer); 
    } 
    timer = setTimeout(onAir,duration); 
    }; 
}); 
+0

+1 za zamknięcie przykładu i wzmiankę o przypadkach skrajnych, bardzo ważne imo – spirytus

Powiązane problemy