clearTimeout без идентификатора - PullRequest
4 голосов
/ 14 декабря 2010

Есть ли способ очистить setTimeout(), если у него нет явного идентификатора? Проблема в том, что мне не разрешено изменять какой-либо уже запущенный код и устанавливать таймеры без какого-либо обработчика.

JS устанавливает для них «анонимные обработчики»? Хранятся ли эти таймеры где-нибудь в наличии? Могу ли я получить какое-либо из этих свойств (функция, которую должен вызвать таймер? Время, когда он будет вызван?)

Ответы [ 4 ]

19 голосов
/ 14 декабря 2010

Нет, вы не можете без справки.Вы могли бы попробовать что-то ДЕЙСТВИТЕЛЬНО хаки (не делайте этого! Это просто иллюстрация хакерства), чтобы очистить все таймауты:

for(var i=0; i<100000; i++) clearTimeout(i);

, но опять-таки это неНадежный и далеко не хакерский.

Решение?Бойтесь иметь возможность изменить источник, так что вы можете сделать это правильно - или посмотреть, можете ли вы переопределить функцию, создающую таймер.

2 голосов
/ 14 декабря 2010

Нет.Метод clearTimeout требует предоставления идентификатора, возвращенного из setTimeout, чтобы удалить время ожидания.

Не могли бы вы опубликовать дополнительную информацию о вашем сценарии?Возможно, некоторые фрагменты кода?Может быть способ обойти сценарий.

1 голос
/ 13 мая 2016

Другой возможный хакерский подход - выдать ошибку где-то в пределах тайм-аута. Чтобы это работало, ошибка не должна быть (a) зафиксирована в блоке try-catch; и (b) произойти до того, как тайм-аут успел предпринять действия, которые вам не нравятся. В зависимости от содержания тайм-аута это может быть легко, сложно или невозможно.

Например, если время ожидания зарегистрировано так:

setTimeout(function(){
   if(document.URL.toUpperCase() === "..."){
      // do something that you don't like
   }
}, 60000);

тогда единственный способ (я думаю), что вы можете выдать ошибку, состоит в том, чтобы обезопасить функцию String.prototype.toUpperCase и проверить, является ли вызывающая функция истекшим временем ожидания. Вы не можете сделать эту проверку с абсолютной уверенностью, но (new Error).stack наверняка пригодится ... вы можете сравнить с ожидаемой трассировкой стека. Вы можете сделать аналогичные вещи, исправляя свойства get, или, возможно, установив конкретный объект на undefined. ES6 может дать некоторые дополнительные возможности.

Это определенно хакерский, и он на самом деле не очищает тайм-аут, он только предотвращает его внешне наблюдаемое поведение. Тем не менее, это может просто сделать свое дело! (Если производительность важна, будьте осторожны с исправлениями.)

0 голосов
/ 14 декабря 2010

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

...