Alle Timeouts / Intervalle in Javascript anzeigen?

87

Ich schreibe eine Anwendung, die JavaScript-Zeitüberschreitungen und -Intervalle verwendet, um die Seite zu aktualisieren. Gibt es eine Möglichkeit zu sehen, wie viele Intervalle eingerichtet sind? Ich möchte sicherstellen, dass ich den Browser nicht versehentlich töte, indem ich Hunderte von Intervallen einrichte.

Ist das überhaupt ein Problem?

Omar Kooheji
quelle

Antworten:

76

Ich glaube nicht , gibt es eine Möglichkeit , aktiv Timer aufzuzählen, aber man konnte außer Kraft setzen window.setTimeoutund window.clearTimeoutund ersetzen sie durch eigene Implementierungen , die eine gewisse Tracking 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 rufen Sie möglicherweise nicht immer an clearTimeout, aber dies gibt Ihnen zumindest die Möglichkeit, zu verfolgen, was zur Laufzeit passiert.

Paul Dixon
quelle
3
Ich habe dies heute in einem Code verwendet, aber ich musste activeTimersdekrementieren, wenn clearTimeoutes nicht aufgerufen wurde. window.setTimeoutDies kann leicht erreicht werden, indem die zweite Zeile durch folgende ersetzt wird : return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Rick Hitchcock
2
Diese Antwort kann nicht mehr funktionieren, da DOM-bezogene JavaScript-Funktionen unveränderlich sind.
John Greene
11

Da Paul nur setTimeout behandelt hat, dachte ich, ich würde einen Zähler für setInterval / clearInterval 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);
};
crv
quelle
9

Anstatt nur eine Anzahl von Timern zu haben, ist hier eine Implementierung, die alle Timerids in einem Array speichert. Es werden nur aktive Timer angezeigt, während die akzeptierte Antwort nur Anrufe an setTimeout& zählt 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));

So können Sie die Anzahl der aktiven Timer auf der Seite ermitteln:

timers.length;

So können Sie alle aktiven Timer entfernen :

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

Bekannte Einschränkungen:

  • setTimeoutMit diesem Affen-Patch können Sie nur eine Funktion (keine Zeichenfolge) übergeben .
  • Die Funktion übernimmt clearIntervalund clearTimeouttut dasselbe, was sie tut, aber es könnte sich in Zukunft ändern.
A1rPun
quelle
Ist es möglich, den Namen aller laufenden zu erhalten SetIntervals? Zum Beispiel var timer = setInterval(function () { }brauche ich einen Timer anstelle der Anzahl der laufenden Intervalle.
Yogesh Patel
Nicht das ich wüsste, ich würde allerdings eine globale Suche mit dem Schlüsselwort "setInterval" und / oder "setTimeout" vorschlagen
Carles Alcolea
4

Wir haben gerade veröffentlicht ein Paket Lösung genau dieses Problems.

npm install time-events-manager

Damit können Sie sie über anzeigen und verwalten timeoutCollection Objekt (und die Intervalle von Javascript über ein intervalCollectionObjekt).

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

Ziv Polack
quelle
2
Ich denke, OP und die meisten Leute suchten nach etwas, das sie entweder als ersten PoC oder später in einer Erweiterung in die Browserkonsole eingeben konnten. Wie würde man das anhand der von Ihnen angegebenen Informationen in die Konsole einfügen?
Carles Alcolea
1

Ich brauchte nur so etwas und das habe ich zusammengestellt:

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 die Intervalle ids zusammen mit ihren Funktionen auf und verfolgt auch ihren Status ( active/ inactive).

Akinuri
quelle