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?

Foi útil?

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.

extension Timers Chrome DevTool

setInterval-sniffer

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 e clearTimeout 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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top