2011-06-22 14 views
12

Zamanlayıcıyı ayarlayan bir işlev var ve zamanlayıcının sona ermesi üzerine kendisini yeniden çağırıyor.Javascript: Yerleşimden önce cleartimeout çağırmak uygun mu?

Bilmek istediğim, işlevin üstündeki zamanlayıcıyı temizlemek için kötü bir uygulama olup olmadığıdır.

Bunun nedeni, bu işlevi zaman zaman eşzamansız olarak çağıracağım ve ilk önce zamanlayıcıyı temizlemezsem, iki eşzamanlı olarak çalışır.

Zamanlayıcıyı işlev için diğer çağrıları yapmadan önce temizleyebileceğimin farkındayım, ancak cleartimeout çağrısını zamanlayıcıyı içeren işlev içinde tutarsam herhangi bir tarayıcıda sorunlara neden olup olmayacağını merak ediyorum .

Başka bir düşünce - Zamanlayıcı değişkeni, cleartimeout çağrısını yapmadan önce, zamanlayıcı olup olmadığını görmek için sınayabilir miyim? Benimle beyin paylaşımı için

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

Teşekkür:

İşte bazı örnek kod!

Kenny

+0

Hizli cevaplar için herkese tesekkur ederiz! Ayrıca, işlevi nasıl çağıracağımı düzelttiğiniz için teşekkürler. Orada yeni bir şey öğrendim! – Kenny

cevap

14

Evet, sorun değil. Ayrıca, "setTimeout()" böyle çağırmalıdır:

timer = setTimeout(onAir, 60000); 
+0

Ben 47 saniye çok geç oldu .... tembel olanlar için – Neal

+6

c'est la vie ici :-) – Pointy

+2

: "c'est la vie ici" anlamına gelir "Bu hayat". –

4

Evet, boş değişkeni bir clearTimeout çağırabilir ve dünya çöker olmaz.

15

Evet bir null değişkeni clearTimeout çağırabilir.

Ayrıca seni senin setTimeout yüzden eval kullanmaz değiştirmek öneririm:

timer = setTimeout(onAir,60000); 
+0

, parens ekleme onAir işlevini yürütecek.sadece referansı geçmek yeterli olmalıdır. – thescientist

+0

@thescientist - teşekkürler kapanış örneğini kaldırmak için '() ' – Neal

0

bir Zaman Aşımı temizlemek bana sorunu değil yükseltir (ama bir javascript guru değilim).

Btw, bu iş parçacığı üzerinde (varolan Zaman Aşımı kontrol) Intersting şeyler bulabilirsiniz: Check if a timeout has been cleared?

5

Evet clearTimeout(timer) çağırabilir, ancak sorunlara neden olabilir bazı kenar durumlar vardır.

timer daha önceden başka bir tamsayı değeriyle ayarlanmışsa, tamamen ilişkisiz bir zamanlayıcıyı öldürüyor olabilirsiniz. setTimeout yalnızca zamanlayıcı için bir tamsayı indeksi döndürür. Bir zamanlayıcı önceden ayarlanmış olmadığından emin iseniz, clearTimeout çağırmadan önce bir çek ekleyebilirsiniz:

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

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

zamanlayıcı değişkenin muhtemel kirliliğe bir çözüm bir kapatma kullanmaktır

+0

+ 1 kaldırmak ve kenar vakaları, çok önemli imodan bahsetmeyi unuttum – spirytus

İlgili konular