Guarda tutti i timeout / intervalli in JavaScript?
-
21-08-2019 - |
Domanda
Sto scrivendo un'applicazione che utilizza i timeout e gli intervalli JavaScript per aggiornare la pagina. Esiste un modo per vedere quanti intervalli sono messa a punto? Voglio fare in modo che non mi sbaglio intenzione di uccidere il browser avendo centinaia di impostazione intervalli.
E 'questo anche un problema?
Soluzione
Non credo che ci sia un modo per enumerare i timer attivi, ma si potrebbe ignorare window.setTimeout e window.clearTimeout e sostituirli con le proprie implementazioni che fanno un po 'di monitoraggio e quindi chiamare gli originali.
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);
};
Naturalmente, non si potrebbe sempre chiamare clearTimeout, ma questo potrebbe almeno dare qualche modo per monitorare ciò che sta accadendo in fase di esecuzione.
Altri suggerimenti
Ho fatto un'estensione Chrome DevTools che mostra tutti gli intervalli. quelli sgomberati sono in grigio.
Visto che Paolo ha coperto solo setTimeout ho pensato di condividere un contatore per 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);
};
Invece di avere un conteggio di timer, qui è un'implementazione che memorizza tutti i timerId di in un array. E 'solo spettacoli timer attivi , mentre la risposta accettata conta solo le chiamate al 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));
In questo modo è possibile ottenere il conteggio dei timer attivi nella pagina:
timers.length;
In questo modo è possibile rimuovere tutti i timer attivi :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Limitazioni note:
- È possibile passare solo una funzione (non una stringa) per
clearInterval
con questa patch scimmia. - La funzione assume <=> e <=> fare lo stesso, che lo fanno, ma potrebbe cambiare in futuro.
Abbiamo appena pubblicato un pacchetto di risolvere questo problema esatto.
npm install time-events-manager
Con questo, è possibile visualizzare e gestirli tramite timeoutCollection
oggetto (e javascript di intervalli tramite intervalCollection
oggetto).
timeoutCollection.getScheduled();
timeoutCollection.getCompleted();
timeoutCollection.getAll();
Ho solo bisogno di qualcosa di simile e questo è quello che ho messo insieme:
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);
Questa registra i ids intervallo con le loro funzioni, e tiene anche traccia del loro stato (attivo / disattivo).