2010-10-26 8 views
7

Tamam, gerçekten basit bir soru. Javascript'te bir çarpışma rotası alıyorum.Javascript'te bir zamanlayıcının temizlenip temizlenmediğini veya zaman aşımına uğradığını nasıl öğrenebilirim?

Ben bir zamanlayıcı ayarlamak için timer = setTimeout(..., 500) kullanırsanız ve sonra clearTimeout(timer) sayacını sıfırlamak için, zamanlayıcı tamsayı değeri böylece benim sorum bir zamanlayıcı zaman aşımına veya kaldırılana olmadığını bilmek nasıl, değişmez?

if (timer) {...} kullanmak istiyorum, ancak açıkça pozitif bir tam sayı her zaman doğru döner.

cevap

12

sonra zamanlayıcı

var timer = setTimeout(function() { 
    alert('you will never see this alert'); 
}, 500); 
clearTimeout(timer); 
+0

Eğer jQuery ya da diğer JS çerçevelerinden biri böyle bir şey olsaydı ben hiç şaşırmam. Varsa, jQuery uzmanları biliyor mu? – MatrixFrog

+0

Bu gerçekten kapsamlıdır. Teşekkürler! – lai

0

Zaman aşımını silerseniz, geri arama gerçekleştirilmez. Bu nedenle, geri çağırma yürütülürse, zaman aşımını ayarladığınızdan beri 500 msn geçmiştir. Örneğin

: Eğer daha resmi bir şey, sen setTimeout/clearTimeout işlevselliği kapsüller javascript sınıfı inşa edebileceğini arıyorsanız clearTimeout(timer)

4

atama null.

Böyle bir sınıf bu gibi görünebilir:

/** class Timer **/ 
var Timer = function(delayMs, callbackFunc) { 
    this.delayMs = delayMs; 
    this.callbackFunc = callbackFunc; 
    this.timerState = 'new'; 
} 
Timer.prototype.start = function() { 
    if(this.tmr) return; 

    var self = this; 
    this.timerState = 'running'; 
    this.tmr = setTimeout(function() { self._handleTmr(); }, this.delayMs); 
} 
Timer.prototype.cancel = function() { 
    if(! this.tmr) return; 

    clearTimeout(this.tmr); 
    this.tmr = null; 
    this.timerState = 'canceled'; 
} 
Timer.prototype._handleTmr = function() { 
    this.tmr = null; 
    this.timerState = 'completed'; 
    this.callbackFunc(); 
} 

Ben de kolayca zamanlayıcı "tamamlandı" veya "iptal" olup olmadığını belirlemek izin verecek bir timerState niteliğini dahil ettik.

Böyle kullanmak olacaktır:

var t = new Timer(500, function() { 
    alert('timer completed'); 
}); 
t.start(); 

// do whatever... 

// now cancel the timer if it hasn't completed yet. 
t.cancel(); 

// maybe you do some other stuff... 
// then check the timerState, and act accordingly. 
// 
if(t.timerState == 'canceled') { 
    alert("the timer was canceled!"); 
} else { 
    alert("the timer completed uneventfully."); 
} 

Sen

(. Örn zamanlayıcı tekrarlayarak/durdurma/devam ettirme, vb başlatmak) de gerekirse ek işlevler eklemek için aynı temel fikri uzatabilirsiniz
+0

Şimdi kullanıyorum budur. Javascript sonra bir düşünce gibi görünüyor. Bunu halletmenin daha iyi yolları var mı? – lai

+0

değil bildiğim, üzgünüm: S Bence bence Win32 da aynı davranıyordu :) –

0

Zamanlayıcı etkinliklerinde kullandığım bir şey var! Bu yardımcı olur umarım.

var toggleTimeOut = (function() { 

    var _timeout; 

    return function (clear_timeout) { 

     if(!clear_timeout) 
     { 
     _timeout = setTimeout(function() {/*DO YOUR STUFF*/}, 5000); 
     } 
     else 
     { 
     if(typeof _timeout != typeof undefined && _timeout != 0) 
     { 
      clearTimeout(_timeout); 
      _timeout= 0; 
     } 
     } 
    } 
    })(); 
İlgili konular