Я пишу програму, яка використовує час очікування та інтервали JavaScript для оновлення сторінки. Чи можна побачити, скільки інтервалів налаштовано? Я хочу переконатись, що випадково не вбию браузер, налаштувавши сотні інтервалів.
Це навіть проблема?
Я пишу програму, яка використовує час очікування та інтервали JavaScript для оновлення сторінки. Чи можна побачити, скільки інтервалів налаштовано? Я хочу переконатись, що випадково не вбию браузер, налаштувавши сотні інтервалів.
Це навіть проблема?
Відповіді:
Я не думаю , що є спосіб перерахувати активні таймери, але ви можете перевизначити 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, але це, принаймні, дасть вам змогу відстежувати, що відбувається під час роботи.
Я зробив розширення Chrome DevTools, яке відображає всі інтервали. Очищені - сірі.

Побачивши, що Пол охоплював лише 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));
Ось як можна отримати кількість активних таймерів на сторінці:
timers.length;
Ось як можна видалити всі активні таймери :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Відомі обмеження:
setTimeoutз цим патчем мавпи.clearIntervalі clearTimeoutробить те саме, що вони роблять, але це може змінитися в майбутньому.SetIntervals? Наприклад, var timer = setInterval(function () { }мені потрібен таймер замість підрахунку інтервалів роботи.
Щойно ми опублікували пакет, який вирішує саме цю проблему.
npm install time-events-manager
Завдяки цьому ви можете переглядати та керувати ними через 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);
Це реєструє інтервали ids разом з їх функціями, а також відстежує їх стан ( active/ inactive).
activeTimersщоб зменшувати , колиclearTimeoutбув НЕ називається. Це легко зробити, замінивши другий рядок наwindow.setTimeoutтакий:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);