Estou escrevendo um aplicativo que utiliza intervalos e tempos limite de JavaScript para atualizar a página. Existe uma maneira de ver quantos intervalos são configurados? Quero ter certeza de que não vou matar acidentalmente o navegador por ter configurado centenas de intervalos.
Isso é mesmo um problema?
javascript
timeout
setinterval
Omar Kooheji
fonte
fonte
activeTimers
decrementar quando nãoclearTimeout
foi chamado. Isso é facilmente realizado substituindo a segunda linha por este:window.setTimeout
return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Fiz uma extensão do Chrome DevTools que mostra todos os intervalos. Os apagados ficam acinzentados.
setInterval-sniffer
fonte
Visto que Paul abordou apenas setTimeout, pensei em compartilhar um contador para 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); };
fonte
Em vez de apenas ter uma contagem de temporizadores, aqui está uma implementação que armazena todos os IDs do temporizador em um array. Mostra apenas os temporizadores ativos, enquanto a resposta aceita conta apenas as chamadas para
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));
É assim que você pode obter a contagem de temporizadores ativos na página:
É assim que você pode remover todos os temporizadores ativos :
for(var i = timers.length; i--;) clearInterval(timers[i]);
Limitações conhecidas:
setTimeout
com este patch monkey.clearInterval
eclearTimeout
faz o mesmo, o que eles fazem, mas pode mudar no futuro.fonte
SetIntervals
? Por exemplovar timer = setInterval(function () { }
, preciso de um cronômetro em vez de contar os intervalos de execução.Acabamos de publicar um pacote que resolve exatamente esse problema.
Com isso, você pode visualizá-los e gerenciá-los via
timeoutCollection
objeto (e os intervalos do javascript viaintervalCollection
objeto).timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();
fonte
Eu só precisava de algo assim e foi isso que eu fiz:
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);
Isso registra o intervalo
id
s junto com suas funções e também mantém o controle de seu status (active
/inactive
).fonte