Die Anzeige aller Timeouts / Intervalle in Javascript?
-
21-08-2019 - |
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?
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.
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
undclearTimeout
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).