У меня проблема с функцией clearTimeout. Оба условия работают, но тайм-аут отказывается очищаться ...... приветствуется любая помощь. Время 300 миллисекунд = params.speed.
**ПРИМЕЧАНИЕ. Этот метод полностью функционален и работает. Единственная проблема, с которой я столкнулся, это очистка setTimeout. Это создает ошибку, когда к новым тостерам без тайм-аута применяется старый setTimeout.
Это означает, что если я нажму кнопку без тайм-аута в течение 3 секунд после нажатия кнопки тайм-аута, старый setTimeout все еще будет применяться к следующему тостеру.
// Beginning of function - line below contains the options for the
// toaster method:
// Invoke via - onclick(e, {text: 'This is an alert with a TIMER',
// timer:true, speed: 3500, color: 'dark'})
toaster: function(e, params = {}) {
// Set defaults for params.object options
var setDefaults = function () {
if (e == null) {
e = this.event;
};
if (params.speed == null) {
params.speed = 3500;
};
if (params.timer == null) {
params.timer = false;
};
if (params.color == null) {
params.color = 'light';
};
if (params.text == null) {
params.text = 'This is a default warning'
};
}();
//Apply timer function
timerOn(params.speed); // params.speed = 4500
var timing; // Variable set outside of the timerOn() function
function timerOn () {
if (params.timer) {
timing = setTimeout(function(){
el[0].classList.remove('show-toaster');
console.log('happening');
}, params.speed);
} else {
clearTimeout(timing);
console.log('just cleared timing variable');
}
} // timerOn ends
timerOn
дважды с установленнымparams.timer
, вы теряете ссылку на первый таймер. Это может быть проблемой - person Jonas Wilms   schedule 23.03.2018timing
где-нибудь еще? Возможно, у вас есть другая функция, которая перезаписывает эту переменную. - person Paul   schedule 23.03.2018params.timer
равно3000
каждый раз, когда вы вызываетеtimerOn
, вы будете только добавлять таймеры и никогда не будете их удалять.3000
соответствует действительности, поэтому блокif
будет выполняться всегда, а блокelse
никогда. - person Paul   schedule 23.03.20180
,false
илиundefined
? - person Paul   schedule 23.03.2018How could I make it more minimal and complete?
Преобразование вашего кода в фрагмент действительно поможет здесь. ClearTimeout, безусловно, работает, так что здесь ошибка где-то еще. - person Keith   schedule 23.03.2018The logic is fine
Очевидно, что нет, иначе у вас не было бы проблем. :) - person Keith   schedule 23.03.2018timerOn(params.speed);
Ваша функция timerOn не принимает аргументов,params.speed
не имеет смысла. - person Keith   schedule 23.03.2018timing
var находится внутри замыкания, он никогда не будет равен тому же таймеру, что и другой созданный вами. Таким образом, вы не сможете очистить этот таймер. это должно быть вне закрытия. - person Keith   schedule 23.03.2018timerOn
, когдаparams.timer
ложно. Нигде в коде, который вы разместили, вы не делаете этого. - person Keith   schedule 23.03.2018toaster
с params timer = false, если это так, это не сработает из-за части закрытия, которую я упомянул. Экземпляр timer var будет новым со значением undefined.. - person Keith   schedule 23.03.2018var timer
является новой переменной каждый раз, когда вы вызываете toater, поэтому выполнение clearTimeout ничего не даст. - person Keith   schedule 23.03.2018higher scope above the timingOn
Но это должно быть более масштабно, чем ваша функцияtoaster
.. Я опубликую простой пример того, что вы делаете, надеюсь, понимание этого поможет вам понять вашу проблему. - person Keith   schedule 23.03.2018