Vendo todos os tempos limite / intervalos em javascript?
-
21-08-2019 - |
Pergunta
Eu estou escrevendo um aplicativo que utiliza o tempo limite e intervalos JavaScript para atualizar a página. Existe uma maneira de ver quantos intervalos são configurados? Eu quero ter certeza que eu não estou acidentalmente vai matar o navegador por ter centenas de configuração intervalos.
É este mesmo um problema?
Solução
Eu não acho que há uma maneira para enumerar os temporizadores ativos, mas você poderia substituir window.setTimeout e window.clearTimeout e substituí-los com suas próprias implementações que fazer alguns rastreamento e, em seguida, chamar os originais.
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);
};
É claro, você não pode sempre chamar clearTimeout, mas isso iria pelo menos dar-lhe alguma forma de acompanhar o que está acontecendo em tempo de execução.
Outras dicas
Eu fiz uma extensão DevTools Chrome, que mostra todos os intervalos. os desmatadas são acinzentado.
Vendo como Paul tem coberto apenas setTimeout eu pensei que eu iria partilhar 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);
};
Em vez de apenas ter uma contagem de temporizadores, aqui é uma implementação que armazena todas timerId de em uma matriz. Isso só mostra temporizadores ativos , enquanto a resposta aceita só conta 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));
Isto é como você pode obter o contagem de temporizadores ativos na página:
timers.length;
Isto é como você pode remover todos os temporizadores ativos :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
limitações conhecidos:
- Você só pode passar uma função (não uma string) para
setTimeout
com este patch macaco. - A função assume
clearInterval
eclearTimeout
fazer o mesmo, o que eles fazem, mas isso pode mudar no futuro.
publicada um pacote de resolver este problema exato.
npm install time-events-manager
Com isso, você pode ver e gerenciá-los via objeto timeoutCollection
(e intervalos objeto viaintervalCollection
de javascript).
timeoutCollection.getScheduled();
timeoutCollection.getCompleted();
timeoutCollection.getAll();
Eu só precisava de algo assim e é isso que eu coloquei:
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 os ids de intervalo, juntamente com as suas funções, e também mantém o controle de seu status (ativo / inativo).