Просмотр всех тайм-аутов/интервалов в javascript?
Я пишу приложение, которое использует тайм-ауты и интервалы JavaScript для обновления страницы. Есть ли способ узнать, сколько интервалов установлено? Я хочу убедиться, что я не случайно буду убивать браузер, установив сотни интервалов.
Это даже проблема?
Ответы
Ответ 1
Я не думаю, что есть способ перечислить активные таймеры, но вы можете переопределить window.setTimeout и window.clearTimeout и заменить их своими собственными реализациями, которые выполняют некоторое отслеживание, а затем вызывают оригиналы.
window.originalSetTimeout=window.setTimeout;
window.originalClearTimeout=window.clearTimeout;
window.activeTimers=0;
window.setTimeout=function(func,delay)
{
window.activeTimers++;
return window.originalSetTimeout(func,delay);
};
window.clearTimeout=function(timerID)
{
window.activeTimers--;
window.originalClearTimeout(timerID);
};
Конечно, вы не всегда можете вызвать clearTimeout, но это, по крайней мере, даст вам какой-то способ отслеживать, что происходит во время выполнения.
Ответ 2
Я сделал расширение Chrome DevTools, которое показывает все интервалы. Очищенные серые.
![Timers Chrome Devtool extension]()
setInterval-sniffer
Ответ 3
Увидев, что Павел только закрыл setTimeout, я подумал, что я бы разделил счетчик для setInterval/clearInterval.
window.originalSetInterval = window.setInterval;
window.originalClearInterval = window.clearInterval;
window.activeIntervals = 0;
window.setInterval = function (func, delay)
{
if(func && delay){
window.activeIntervals++;
}
return window.originalSetInterval(func,delay);
};
window.clearInterval = function (intervalId)
{
// JQuery sometimes hands in true which doesn't count
if(intervalId !== true){
window.activeIntervals--;
}
return window.originalClearInterval(intervalId);
};
Ответ 4
Вместо того, чтобы просто иметь счетчик таймеров, вот реализация, которая хранит все таймеры в массиве. Он показывает только активные таймеры, в то время как принятый ответ учитывает только вызовы setTimeout
и clearTimeout
.
(function(w) {
var oldST = w.setTimeout;
var oldSI = w.setInterval;
var oldCI = w.clearInterval;
var timers = [];
w.timers = timers;
w.setTimeout = function(fn, delay) {
var id = oldST(function() {
fn && fn();
removeTimer(id);
}, delay);
timers.push(id);
return id;
};
w.setInterval = function(fn, delay) {
var id = oldSI(fn, delay);
timers.push(id);
return id;
};
w.clearInterval = function(id) {
oldCI(id);
removeTimer(id);
};
w.clearTimeout = w.clearInterval;
function removeTimer(id) {
var index = timers.indexOf(id);
if (index >= 0)
timers.splice(index, 1);
}
}(window));
Вот как вы можете получить количество активных таймеров на странице:
timers.length;
Вот как вы можете удалить все активные таймеры:
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Известные ограничения:
- Вы можете передать функцию (не строку) в
setTimeout
с этим патчем обезьяны.
- Функция предполагает
clearInterval
и clearTimeout
делать то же самое, что и они, но это может измениться в будущем.
Ответ 5
Мы только опубликовали пакет, решая эту точную проблему.
npm install time-events-manager
С этим вы можете просматривать и управлять ими через объект timeoutCollection
(и интервалы javascript через объект intervalCollection
).