2010-10-26 15 views
7

Ok, pregunta realmente simple. Estoy tomando un curso acelerado en JavaScript.¿Cómo saber si un temporizador se borró o se agotó el tiempo de espera en javascript?

Si uso timer = setTimeout(..., 500) para configurar un temporizador, y luego clearTimeout(timer) a cero el temporizador, el valor entero del contador de tiempo no cambia, por lo que mi pregunta es cómo saber si un contador de tiempo se mide el tiempo hacia fuera o se borra?

Quiero usar if (timer) {...}, pero obviamente un entero positivo siempre devuelve verdadero.

Respuesta

12

Si usted está buscando algo más formal, se podría construir Javascript clase que encapsula la funcionalidad setTimeout/clearTimeout.

una clase de este tipo podría ser algo como esto:

/** 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(); 
} 

También he incluido un atributo timerState que le permiten determinar fácilmente si el temporizador fue "terminado" o "cancelar".

Se podría utilizar de esta manera:

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

se puede extender la misma idea básica para incluir funcionalidad adicional si lo necesita (por ejemplo, la repetición de temporizador, inicio/parada/hoja de vida, etc.)

+0

No me sorprendería en absoluto si jQuery o uno de los otros frameworks JS tuviera algo como esto. ¿Algún experto de jQuery sabe si existe o no? – MatrixFrog

+0

Esto es realmente completo. ¡Gracias! – lai

0

Si borra el tiempo de espera, la devolución de llamada no se ejecutará. Entonces, si se ejecuta la devolución de llamada, significa que han pasado 500 ms desde que se estableció el tiempo de espera.

Por ejemplo:

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

asignar null al temporizador después de la clearTimeout(timer)

+0

Esto es lo que estoy usando ahora. Parece una idea de último momento en Javascript. ¿Alguna mejor manera de manejar esto? – lai

+0

no es que yo sepa, lo siento: S Creo que las identidades en Win32 se comportaron igual :) –

0

¡Aquí hay algo que uso para los eventos del temporizador! Espero que esto ayude.

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; 
     } 
     } 
    } 
    })(); 
Cuestiones relacionadas