Estoy escribiendo una aplicación que utiliza tiempos de espera e intervalos de JavaScript para actualizar la página. ¿Hay alguna forma de ver cuántos intervalos están configurados? Quiero asegurarme de que no voy a matar accidentalmente el navegador al configurar cientos de intervalos.
¿Es esto siquiera un problema?
javascript
timeout
setinterval
Omar Kooheji
fuente
fuente
activeTimers
a disminuir cuandoclearTimeout
se no se llama. Eso se logra fácilmente reemplazando la segunda línea dewindow.setTimeout
con esto:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Hice una extensión de Chrome DevTools que muestra todos los intervalos. Los borrados están en gris.
setInterval-sniffer
fuente
Dado que Paul solo ha cubierto setTimeout, pensé en compartir un contador para 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); };
fuente
En lugar de solo tener un conteo de temporizadores, aquí hay una implementación que almacena todos los identificadores de temporizador en una matriz. Solo muestra temporizadores activos mientras que la respuesta aceptada solo cuenta las llamadas a
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));
Así es como puede obtener el recuento de temporizadores activos en la página:
Así es como puede eliminar todos los temporizadores activos :
for(var i = timers.length; i--;) clearInterval(timers[i]);
Limitaciones conocidas:
setTimeout
con este parche de mono.clearInterval
yclearTimeout
hace lo mismo, lo que hacen pero podría cambiar en el futuro.fuente
SetIntervals
? Por ejemplovar timer = setInterval(function () { }
, necesito un temporizador en lugar de contar los intervalos de ejecución.Acabamos de publicar un paquete que resuelve este problema exacto.
Con eso, puede verlos y administrarlos a través de
timeoutCollection
objetos (y los intervalos de JavaScript a través deintervalCollection
objetos).timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();
fuente
Solo necesitaba algo como esto y esto es lo que he reunido:
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);
Esto registra el intervalo
id
s junto con sus funciones y también realiza un seguimiento de su estado (active
/inactive
).fuente