Просмотр всех тайм-аутов / интервалов в JavaScript? - PullRequest
74 голосов
/ 13 мая 2009

Я пишу приложение, которое использует тайм-ауты JavaScript и интервалы для обновления страницы. Есть ли способ узнать, сколько интервалов установлено? Я хочу убедиться, что не случайно убью браузер, настроив сотни интервалов.

Это вообще проблема?

Ответы [ 6 ]

67 голосов
/ 13 мая 2009

Я не думаю, что есть способ перечислить активные таймеры, но вы можете переопределить window.setTimeout и window.clearTimeout и заменить их своими собственными реализациями, которые выполняют некоторое отслеживание, а затем вызывают оригиналы.

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);
};

Конечно, вы не всегда можете вызывать clearTimeout, но это, по крайней мере, даст вам возможность отслеживать, что происходит во время выполнения.

25 голосов
/ 23 мая 2013

Я сделал расширение Chrome DevTools, которое показывает все интервалы. Очищенные выделены серым цветом.

Timers Chrome Devtool extension

setInterval-перехватчик

10 голосов
/ 20 сентября 2011

Поскольку Пол покрыл только setTimeout, я решил поделиться счетчиком для 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);
};
8 голосов
/ 11 марта 2016

Вместо того, чтобы просто иметь количество таймеров, здесь есть реализация, которая хранит все таймеры в массиве. Отображаются только активные таймеры , в то время как принятый ответ учитывает только вызовы 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));

Вот как вы можете получить количество активных таймеров на странице:

timers.length;

Вот как вы можете удалить все активные таймеры :

for(var i = timers.length; i--;)
    clearInterval(timers[i]);

Известные ограничения:

  • Вы можете передать функцию (не строку) в setTimeout с помощью этого патча обезьяны.
  • Функция предполагает, что clearInterval и clearTimeout делают то же самое, что они делают, но это может измениться в будущем.
4 голосов
/ 11 мая 2017

Мы только что опубликовали пакет, решающий эту проблему.

npm install time-events-manager

При этом вы можете просматривать их и управлять ими с помощью объекта timeoutCollection (а интервалы JavaScript с помощью объекта intervalCollection).

timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();

0 голосов
/ 19 февраля 2018

Мне просто нужно было что-то подобное, и вот что я собрал:

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);

Записывает идентификаторы интервалов вместе с их функциями, а также отслеживает их статус (активный / неактивный).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...