2009-05-13 21 views
52

Estoy escribiendo una aplicación que utiliza tiempos de espera e intervalos de JavaScript para actualizar la página. ¿Hay alguna manera de ver cuántos intervalos están configurados? Quiero asegurarme de que no voy a matar accidentalmente el navegador configurando cientos de intervalos.Viendo todos los tiempos de espera/intervalos en javascript?

¿Esto es incluso un problema?

Respuesta

53

No creo que haya una manera de enumerar los temporizadores activos, pero puede anular window.setTimeout y window.clearTimeout y reemplazarlos con sus propias implementaciones que hacen un seguimiento y luego llaman a los originales.

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); 
}; 

Por supuesto, no se puede llamar siempre a clearTimeout, pero esto habría al menos darle una cierta manera de realizar un seguimiento de lo que está sucediendo en tiempo de ejecución.

+5

Tenga en cuenta que la línea 2 tiene un error tipográfico. window.cleartTimeout debe ser window.clearTimeout. SO no me permitirá editarlo sin cambiar al menos 6 caracteres. – checker

+7

bien visto, ¡pasó 3 años antes de que alguien lo notara! –

+3

Lo usé en algún código hoy, pero necesitaba 'activeTimers' para disminuir cuando' clearTimeout' era * no * llamado. Esto se logra fácilmente reemplazando la segunda línea de 'window.setTimeout' con esto:' return window.originalSetTimeout (function() {func(); activeTimers -;}, delay); ' –

11

Como Paul solo ha cubierto setTimeout, pensé que compartiría 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); 
}; 
24

Hice una extensión DevTools de Chrome que muestra todos los intervalos. Los borrados están en gris.

Timers Chrome Devtool extension

setInterval-sniffer

+5

Lamentablemente esto parece haber dejado de funcionar con Chrome. –

6

En lugar de simplemente tener un recuento de los temporizadores, aquí es una aplicación que almacena todos de timerId 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)); 

Esto es cómo se puede obtener el recuento de los temporizadores activos en la página:

timers.length; 

Así es como se puede eliminar todos los temporizadores activos:

for(var i = timers.length; i--;) 
    clearInterval(timers[i]); 

Limitaciones conocidas:

  • Solo puede pasar una función (no una cadena) a setTimeout con este parche de mono.
  • La función asume que clearInterval y clearTimeout hacen lo mismo, lo cual hacen, pero podría cambiar en el futuro.
+0

¿Es posible obtener el nombre de todos los ejecutores 'SetIntervals'? Por ejemplo 'var timer = setInterval (function() {}' Necesito * timer * en lugar del recuento de los intervalos de ejecución. –

2

Tenemos published un paquete que resuelve este problema exacto.

npm install time-events-manager 

Con esto, se puede ver y gestionar a través de ellas timeoutCollection objeto (y los intervalos de javascript vía intervalCollection objeto).

0

Sólo necesitaba algo como esto y esto es lo que he juntado:

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 los ID de intervalo junto con sus funciones, y también realiza un seguimiento de su estado (activo/inactivo).

Cuestiones relacionadas