Pregunta

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 no cerrar accidentalmente el navegador al configurar cientos de intervalos.

¿Es esto siquiera un problema?

¿Fue útil?

Solución

No creo que hay una manera de enumerar los temporizadores activos, pero se podía anular window.setTimeout y window.clearTimeout y reemplazarlos con sus propias implementaciones que hacen un poco de seguimiento y luego llamar 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, es posible que no siempre llamar clearTimeout, pero esto al menos darle una cierta manera de realizar un seguimiento de lo que está sucediendo en tiempo de ejecución.

Otros consejos

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

setInterval-sniffer

En vista de que Pablo sólo ha cubierto setTimeout pensé que iba a 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);
};

En lugar de simplemente contar los temporizadores, aquí hay una implementación que almacena todos los temporizadores 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 puedes conseguir el recuento de temporizadores activos en la pagina:

timers.length;

Así es como puedes eliminar todos los temporizadores activos:

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

Limitaciones conocidas:

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

publicada un paquete de la solución de este problema exacto.

npm install time-events-manager

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

timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();

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 mantiene un registro de su estado (activo / inactivo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top