Я пишу приложение, которое использует тайм-ауты и интервалы JavaScript для обновления страницы. Есть ли способ узнать, сколько интервалов установлено? Я хочу убедиться, что случайно не убью браузер, настроив сотни интервалов.
Это вообще проблема?
javascript
timeout
setinterval
Омар Кухеджи
источник
источник
activeTimers
было уменьшить, когдаclearTimeout
он не был вызван. Этого легко добиться, заменив вторую строчку наwindow.setTimeout
это:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Я сделал расширение Chrome DevTools, которое показывает все интервалы. Очищенные отображаются серым цветом.
setInterval-сниффер
источник
Поскольку Пол охватил только 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); };
источник
Вместо того, чтобы просто подсчитывать таймеры, вот реализация, которая хранит все таймеры в массиве. Он показывает только активные таймеры, в то время как принятый ответ учитывает только звонки на
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));
Вот как вы можете узнать количество активных таймеров на странице:
Вот как вы можете удалить все активные таймеры :
for(var i = timers.length; i--;) clearInterval(timers[i]);
Известные ограничения:
setTimeout
с этим патчем обезьяны.clearInterval
иclearTimeout
делает то же самое, что и они, но это может измениться в будущем.источник
SetIntervals
? Например,var timer = setInterval(function () { }
мне нужен таймер вместо подсчета интервалов бега.Мы только что опубликовали пакет, решающий именно эту проблему.
При этом вы можете просматривать и управлять ими через
timeoutCollection
объект (и интервалы javascript черезintervalCollection
объект).timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();
источник
Мне просто нужно было что-то вроде этого, и вот что я собрал:
window.setInterval = function (window, setInterval) { if (!window.timers) { window.timers = {}; } if (!window.timers.intervals) { window.timers.intervals = {}; } if (!window.timers.intervals.active) { window.timers.intervals.active = {}; } return function (func, interval) { var id = setInterval(func, interval); window.timers.intervals.active[id] = func; return id; } }(window, window.setInterval); window.clearInterval = function (window, clearInterval) { if (!window.timers) { window.timers = {}; } if (!window.timers.intervals) { window.timers.intervals = {}; } if (!window.timers.intervals.inactive) { window.timers.intervals.inactive = {}; } return function (id) { if (window.timers.intervals.active && window.timers.intervals.active[id]) { window.timers.intervals.inactive[id] = window.timers.intervals.active[id]; clearInterval(id); delete window.timers.intervals.active[id]; } } }(window, window.clearInterval);
Это записывает интервал
id
s вместе с их функциями, а также отслеживает их статус (active
/inactive
).источник