Мне интересно, есть ли способ узнать, установлен ли тайм-аут
var t=setTimeout("alertMsg()",3000);
Я думал, что t будет как undefined, когда вы его очистите. Но, похоже, какой-то идентификатор не очищается.
Мне интересно, есть ли способ узнать, установлен ли тайм-аут
var t=setTimeout("alertMsg()",3000);
Я думал, что t будет как undefined, когда вы его очистите. Но, похоже, какой-то идентификатор не очищается.
Не напрямую, но вы можете создать объект-оболочку для предоставления этой функциональности. Грубая реализация выглядит так:
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
Прежде всего, я отдает должное Риду за части этого ответа, однако я чувствовал, что должен добавить некоторые предложения. С моими небольшими дополнениями к коду 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;
};
[начать прокрутку без комментариев] О, и я использую прототипную модель добавления методов к классам, но только потому, что я предпочитаю это не потому, что я чувствую, что это более правильно [конец без комментариев]
Просто установите t
в 0
(или t в вашем случае) в вашей функции тайм-аута:
timeoutID = 0;
Если вы используете clearTimeout
, он устанавливает id таймаута равным 0, поэтому проверка на timeoutID === 0
будет проверять, была ли она очищена или завершена.
Нет. Чтобы узнать, вам нужно будет обнулить переменную t
после вызова clearTimeout
. В противном случае индикатора действительно нет.
И FYI, лучше передать прямую ссылку на функцию вместо строки, которая будет оценена.
var t=setTimeout(alertMsg,3000);
Как некоторые пользователи предлагают в комментариях, всякий раз, когда таймаут либо срабатывает (после истечения установленного времени), либо сбрасывается с помощью clearTimeout
, установите его вручную на false
или предпочтительно null
. Затем вы можете выполнить простую проверку if, чтобы убедиться, что она активна. Также не забудьте инициализировать его как false
/null
при необходимости.
Создал небольшую тестовую страницу для этого:https://codepen.io/TheJesper/pen/rJzava
Есть еще один способ проверить наличие таймаута. Значение, которое содержит тайм-аут, имеет значение по умолчанию, которое увеличивается со временем. Поэтому мы можем сделать следующее в построении "if":
if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){
//Do something
}