Перегляд усіх тайм-аутів / інтервалів у javascript?


88

Я пишу програму, яка використовує час очікування та інтервали JavaScript для оновлення сторінки. Чи можна побачити, скільки інтервалів налаштовано? Я хочу переконатись, що випадково не вбию браузер, налаштувавши сотні інтервалів.

Це навіть проблема?

Відповіді:


77

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


3
Я використовував це в якійсь - то код сьогодні, але мені потрібно , activeTimersщоб зменшувати , коли clearTimeoutбув НЕ називається. Це легко зробити, замінивши другий рядок на window.setTimeoutтакий: return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Рік Хічкок

2
Ця відповідь більше не зможе працювати, оскільки пов'язані з DOM функції JavaScript будуть "незмінними".
Джон Грін,

29

Я зробив розширення Chrome DevTools, яке відображає всі інтервали. Очищені - сірі.

Таймери Chrome Devtool розширення

setInterval-sniffer


10
На жаль, це, здається, припинило роботу з Chrome.
Джозеф Леннокс,

@JosephLennox Ця альтернатива працює, перевірена зараз: chrome.google.com/webstore/detail/timeouts-and-intervals/…
Тревер Томпсон,

@TreverThompson це теж не працює.
SeyyedKhandon

11

Побачивши, що Пол охоплював лише 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);
};

9

Замість того, щоб просто підрахувати таймери, ось реалізація, яка зберігає всі таймери в масиві. Він відображає лише активні таймери, тоді як прийнята відповідь враховує лише дзвінки до 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робить те саме, що вони роблять, але це може змінитися в майбутньому.

Чи можна отримати назву всіх запущених SetIntervals? Наприклад, var timer = setInterval(function () { }мені потрібен таймер замість підрахунку інтервалів роботи.
Йогеш Патель

Не те, що я знаю, я б запропонував глобальний пошук із ключовим словом "setInterval" та / або "setTimeout"
Carles Alcolea,

4

Щойно ми опублікували пакет, який вирішує саме цю проблему.

npm install time-events-manager

Завдяки цьому ви можете переглядати та керувати ними через timeoutCollectionоб'єкт (і інтервали javascript через intervalCollectionоб'єкт).

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


2
Я думаю, що OP та більшість людей шукали щось, що можна ввести на консолі браузера як перший PoC і, можливо, пізніше як розширення. Як можна було б покласти це на консоль з інформації, яку ви надали?
Carles Alcolea

1

Мені просто потрібно було щось подібне, і ось що я зібрав:

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

Це реєструє інтервали ids разом з їх функціями, а також відстежує їх стан ( active/ inactive).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.