Как узнать, очищен ли таймер или тайм-аут в Javascript? - PullRequest
7 голосов
/ 26 октября 2010

Хорошо, действительно простой вопрос.Я беру ускоренный курс в JavaScript.

Если я использую timer = setTimeout(..., 500), чтобы установить таймер, а затем clearTimeout(timer), чтобы очистить таймер, целочисленное значение таймера не меняется, поэтому мой вопросКак узнать, истек ли таймер или очищен?

Я хочу использовать if (timer) {...}, но, очевидно, положительное целое всегда возвращает true.

Ответы [ 5 ]

12 голосов
/ 26 октября 2010

Если вы ищете что-то более формальное, вы можете создать класс 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.");
}

Вы можете расширить ту же базовую идею, чтобы включить дополнительные функции, если вам это нужно (например, повторение таймера, запуск / остановка / возобновление и т. Д.)

4 голосов
/ 26 октября 2010

назначить null таймеру после clearTimeout(timer)

0 голосов
/ 25 апреля 2019

Я вообще не использую флаги в JS, но это тот случай, когда это имеет смысл и делает вещи красивыми и простыми. Идея состоит в том, что вы устанавливаете флаг, как только ваш таймер срабатывает, а затем вы можете проверить , что в другом месте кода.

let fired = false;

// Set your timeout to do future work...
const timeout = window.setTimeout(() => {
    fired = true;
    // ...
}, 3000);

// Test it
const testInterval = window.setInterval(() => {
    console.log(`Timer has ${fired ? ' ' : 'not '}fired`);
    fired && window.clearInterval(testInterval);
}, 500);
0 голосов
/ 10 июня 2015

Вот то, что я использую для событий таймера! Надеюсь, это поможет.

    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;
        }
      }
    }
  })();
0 голосов
/ 26 октября 2010

Если вы сбросите время ожидания, обратный вызов не будет выполнен. Таким образом, если обратный вызов выполнен, это означает, что прошло 500 мс с момента установки времени ожидания.

Например:

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