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