Трюк с очисткой всех интервалов и таймаутов

Перечитывал JavaScript-Garden, в секции таймеров есть следующий код:
// удаляем "все" таймауты
for(var i = 1; i < 1000; i++) {
    clearTimeout(i);
}
Авторы утверждают, что не все таймауты могут быть завершены этим циклом, и это утверждение не вызывает сомнений. Но способ остановить все таймауты (и интервалы) все-же есть. Фишка в том, что функции setTimeout и setInterval возвращают id таймера, который при каждом вызове увеличивается на 1 (и для интервалоц и таймаутов). Таким образом, если создать интервал прямо перед очисткой всех интервалов, то его id будет наибольшим. Все, кто имеет меньший id будут очищены:
// удаляем все таймауты
var max_id;

max_id = setTimeout(function () {});
while (max_id--) {
    clearTimeout(max_id);
}
Share
Send
2 comments
Ajax
Такое ощущение, что после применения данной фичи не работает hover.

$(‘#left, #right’).hover(function(){
$(this).fadeTo(500, 1);
}, function(){
$(this).fadeTo(500, 0.3);
});

Перестаёт работать после включения в код либо цикла выше, либо описанного способа с max_id. В чем может быть проблема?
Дмитрий Подгорный
Скорее всего дело в том, как реализованы анимации в jQuery. Дальше следуют мои предположения:
для оптимизации repaint все анимации jQuery выполняет в собственном интервале (или интервале, реализованном через setTimeout, так называемый “гарантированный интервал”).

Этот трюк не должен использоваться в продакшене, пока ты не уверен, что готов ввести код, который может повлиять на все приложение.

Если все же надо найти айдишник таймаута или интервала, но попробовать не сломать jQuery, попробуй сузить область поиска. Так как айдишники начинаются с 1 и увеличиваются на 1, можно попробовать диагностировать, что тебе нужно очищать интвервалы и таймауты, начиная с 400 по 800 айдишники.

И помни, что адишник интервала будет разным при разных запусках программы, может зависить от машины пользователя, времени загрузки страницы, браузера, плагинов браузера, погоды и мирового эфира.
Ajax
В моем случае ID интервалов равнялись 2,4,5. Всего три интервала, установленных с помощью setInterval. Интересно, куда Jquery дел остальные ID?! Если первый вариант(цикл фор) изменить, а именно i < 6, то все работает, только при этом интервал с периодом 500 останавливается не сразу. Если i >=6, то многие скрипты не работают.
Дмитрий Подгорный
> Интересно, куда Jquery дел остальные ID?
Постановка некорректная. Любой интервал или таймаут увеличат адишник. Интервалы и таймауты могут быть поставлены аналитикой, библиотеками, чужим кодом, своим кодом, плагинами, то есть любым кодом.

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