J'écris une application qui utilise des délais et des intervalles JavaScript pour mettre à jour la page. Existe-t-il un moyen de voir combien d'intervalles sont configurés? Je veux m'assurer que je ne vais pas accidentellement tuer le navigateur en configurant des centaines d'intervalles.
Est-ce même un problème?
javascript
timeout
setinterval
Omar Kooheji
la source
la source
activeTimers
de décrémenter quand ilclearTimeout
n'était pas appelé. C'est facilement accompli en remplaçant la deuxième ligne dewindow.setTimeout
par ceci:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
J'ai créé une extension Chrome DevTools qui montre tous les intervalles. Ceux qui sont effacés sont grisés.
setInterval-sniffer
la source
Étant donné que Paul n'a couvert que setTimeout, j'ai pensé partager un compteur pour 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); };
la source
Au lieu de simplement avoir un nombre de minuteries, voici une implémentation qui stocke tous les identificateurs de minuterie dans un tableau. Il n'affiche que les minuteries actives tandis que la réponse acceptée ne compte que les appels vers
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));
Voici comment obtenir le nombre de minuteries actives sur la page:
Voici comment supprimer tous les minuteurs actifs :
for(var i = timers.length; i--;) clearInterval(timers[i]);
Limitations connues:
setTimeout
avec ce patch de singe.clearInterval
etclearTimeout
fait la même chose, ce qu'elle fait, mais cela pourrait changer à l'avenir.la source
SetIntervals
? Par exemple,var timer = setInterval(function () { }
j'ai besoin d'une minuterie au lieu du nombre d'intervalles en cours d'exécution.Nous venons de publier un package résolvant exactement ce problème.
Avec cela, vous pouvez les afficher et les gérer via un
timeoutCollection
objet (et les intervalles de javascript via unintervalCollection
objet).timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();
la source
J'avais juste besoin de quelque chose comme ça et c'est ce que j'ai mis en place:
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);
Cela enregistre les intervalles
id
avec leurs fonctions, et garde également une trace de leur état (active
/inactive
).la source