Frage

Ich schreibe eine Anwendung, die JavaScript-Timeouts und Intervalle verwendet die Seite zu aktualisieren. Gibt es eine Möglichkeit, um zu sehen, wie viele Intervalle Setup? Ich möchte sicherstellen, dass ich nicht versehentlich den Browser zu töten gehen von Hunderten von Intervallen Setup haben.

Ist das auch ein Thema?

War es hilfreich?

Lösung

Ich glaube nicht, gibt es eine Möglichkeit, aktiv Timer aufzuzählen, aber man konnte außer Kraft setzen window.setTimeout und window.clearTimeout und ersetzen Sie sie mit Ihrem eigenen Implementierungen, die eine Verfolgung zu tun und dann die Originale nennen.

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

Natürlich können Sie nicht immer clear nennen, aber dies würde zumindest gibt Ihnen eine Möglichkeit, zu verfolgen, was zur Laufzeit geschieht.

Andere Tipps

Ich habe eine Chrome-Erweiterung, die DevTools alle Intervalle zeigt. Gelöscht diejenigen sind grau dargestellt.

Timer Chrome DevTool Erweiterung

setInterval-Sniffer

als Paul sehen nur bedeckt hat SetTimeout ich dachte, ich würde für setInterval / clearInterval einen Zähler teilen.

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

Statt nur eine Anzahl von Timern haben, hier ist eine Implementierung, die alle timerId die in einem Array speichert. Es zeigt nur, aktive Timer , während die akzeptierte Antwort nur Anrufe zählt 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));

Dies ist, wie Sie die Anzahl der aktiven Timer auf der Seite zu bekommen:

timers.length;

Dies ist, wie Sie Löschen Sie alle aktiven Timer :

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

Bekannte Einschränkungen:

  • Sie können nur eine Funktion (kein String) übergeben mit diesem Affen Patch setTimeout.
  • Die Funktion geht davon aus clearInterval und clearTimeout das gleiche tun, was sie tun, aber es könnte sich in Zukunft ändern.

Wir haben gerade ein Paket veröffentlicht genau dieses Problem zu lösen.

npm install time-events-manager

Damit können Sie diese über timeoutCollection Objekt anzuzeigen und zu verwalten (und Javascript der Intervalle viaintervalCollection Objekt).

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

Ich habe so etwas wie dies benötigt, und das ist, was ich zusammen haben:

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

Dies zeichnet den Intervall-IDs zusammen mit ihren Funktionen und verfolgt auch dessen Status (aktiv / inaktiv).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top