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?

È stato utile?

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.

setInterval-sniffer

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top