Очистка вложенного setInterval?
Возникли проблемы с очисткой setInterval, который вложен в другой setInterval.
polling
очищается просто отлично, но marque
(который установлен глобально) продолжает стрельбу, хотя очищенный выплевывается в консоль несколько раз.
listener: function() {
var polling;
journalScroll.on('scrollEnd', function() {
clearInterval(polling);
Roots.common.journal.scroll.status();
console.log('scrollend');
});
journalScroll.on('scrollStart', function() {
polling = setInterval(Roots.common.journal.scroll.status, 1250); // Time in milliseconds
console.log('scrollstart');
});
},
status: function() {
console.log('scroll status');
if((journalScroll.y*-1) < $(window).height() * 3) {
console.log('setinterval');
marque = setInterval(function() {
Roots.common.journal.scroll.marque();
}, 50);
} else {
clearInterval(marque);
console.log('cleared');
}
},
marque: function() {
console.log('polling marque');
},
1 ответ
setInterval
просто возвращает идентификатор (целое число) и будет пытаться запустить таймер на неопределенный срок, пока вы не передадите этот же идентификатор обратно clearInterval
функция. Из-за относительно непредсказуемой природы событий и асинхронной функциональности, вызовы и обратные вызовы часто могут привести к условиям гонки.
Например, ваш код может создавать новый интервал и назначать другой идентификатор marque
переменная до того, как старый интервал был очищен - это приводит к тому, что он становится "осиротевшим", поскольку он все еще работает, и у вас нет идентификатора, с которым можно его отменить.
Не видя весь ваш код, самый простой способ "исправить" проблему - слепо clearInterval(marque);
до тебя setInterval
в вашем status
функция - обеспечение того, чтобы в этом случае был активен только один интервал в любой момент времени.