Подтвердить что ты не робот

Проверьте, очищен ли тайм-аут?

Мне интересно, есть ли способ узнать, установлен ли тайм-аут

var t=setTimeout("alertMsg()",3000);

Я думал, что t будет как undefined, когда вы его очистите. Но, похоже, какой-то идентификатор не очищается.

4b9b3361

Ответ 1

Не напрямую, но вы можете создать объект-оболочку для предоставления этой функциональности. Грубая реализация выглядит так:

function Timeout(fn, interval) {
    var id = setTimeout(fn, interval);
    this.cleared = false;
    this.clear = function () {
        this.cleared = true;
        clearTimeout(id);
    };
}

Тогда вы можете сделать что-то вроде:

var t = new Timeout(function () {
    alert('this is a test');
}, 5000);
console.log(t.cleared); // false
t.clear();
console.log(t.cleared); // true

Ответ 2

Прежде всего, я отдает должное Риду за части этого ответа, однако я чувствовал, что должен добавить некоторые предложения. С моими небольшими дополнениями к коду Reid это будет:

  • автоматически очищается, когда истекает срок ожидания
  • необязательно установить область действия таймаута (а не просто выполнять глобальную область).
  • необязательно передать массив аргументов функции таймаута

вот он:

function Timeout(fn, interval, scope, args) {
    scope = scope || window;
    var self = this;
    var wrap = function(){
        self.clear();
        fn.apply(scope, args || arguments);
    }
    this.id = setTimeout(wrap, interval);
}
Timeout.prototype.id = null
Timeout.prototype.cleared = false;
Timeout.prototype.clear = function () {
    clearTimeout(this.id);
    this.cleared = true;
    this.id = null;
};

[начать прокрутку без комментариев] О, и я использую прототипную модель добавления методов к классам, но только потому, что я предпочитаю это не потому, что я чувствую, что это более правильно [конец без комментариев]

Ответ 3

Просто установите t в 0 (или t в вашем случае) в вашей функции тайм-аута:

timeoutID = 0;

Если вы используете clearTimeout, он устанавливает id таймаута равным 0, поэтому проверка на timeoutID === 0 будет проверять, была ли она очищена или завершена.

Ответ 4

Нет. Чтобы узнать, вам нужно будет обнулить переменную t после вызова clearTimeout. В противном случае индикатора действительно нет.

И FYI, лучше передать прямую ссылку на функцию вместо строки, которая будет оценена.

var t=setTimeout(alertMsg,3000);

Ответ 5

Как некоторые пользователи предлагают в комментариях, всякий раз, когда таймаут либо срабатывает (после истечения установленного времени), либо сбрасывается с помощью clearTimeout, установите его вручную на false или предпочтительно null. Затем вы можете выполнить простую проверку if, чтобы убедиться, что она активна. Также не забудьте инициализировать его как false/null при необходимости.

Создал небольшую тестовую страницу для этого:https://codepen.io/TheJesper/pen/rJzava

Ответ 6

Есть еще один способ проверить наличие таймаута. Значение, которое содержит тайм-аут, имеет значение по умолчанию, которое увеличивается со временем. Поэтому мы можем сделать следующее в построении "if":

if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){
  //Do something
}