如何知道计时器在javascript中是清除还是超时?

lai*_*lai 7 javascript settimeout

好的,非常简单的问题.我在javascript参加速成课程.

如果我 timer = setTimeout(..., 500)用来设置定时器,然后clearTimeout(timer)清除定时器,定时器的整数值不会改变,所以我的问题是如何知道定时器是超时还是清除?

我想使用if (timer) {...},但显然正整数总是返回true.

Lee*_*Lee 12

如果您正在寻找更正式的东西,您可以构建封装setTimeout/ clearTimeout功能的javascript类.

这样的类可能看起来像这样:

/** 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();
}
Run Code Online (Sandbox Code Playgroud)

我还添加了一个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.");
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以扩展相同的基本思想以包含其他功能(例如,重复计时器,开始/停止/恢复等)


Ale*_*hev 5

之后分配null给定时器clearTimeout(timer)