Если вы ищете что-то более формальное, вы можете создать класс javascript, который инкапсулирует функциональность setTimeout
/ clearTimeout
.
Такой класс может выглядеть примерно так:
/** 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();
}
Я также включил атрибут timerState
, который позволил бы вам легко определить, был ли таймер «завершен» или «отменен».
Вы можете использовать его следующим образом:
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.");
}
Вы можете расширить ту же базовую идею, чтобы включить дополнительные функции, если вам это нужно (например, повторение таймера, запуск / остановка / возобновление и т. Д.)