Przeglądasz wszystkie limity czasu / interwały w javascript?


88

Piszę aplikację, która używa limitów czasu i interwałów JavaScript do aktualizacji strony. Czy istnieje sposób, aby sprawdzić, ile przedziałów czasu zostało skonfigurowanych? Chcę się upewnić, że przypadkowo nie zabiję przeglądarki, ustawiając setki interwałów.

Czy to w ogóle problem?

Odpowiedzi:


77

Nie sądzę, że istnieje sposób, aby wyliczyć aktywne liczniki, ale można zastąpić window.setTimeouti window.clearTimeouti zastąpić je własnymi implementacjami które wykonują jakąś śledzenie, a następnie wywołać oryginały.

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

Oczywiście możesz nie zawsze dzwonić clearTimeout, ale to przynajmniej da ci sposób na śledzenie tego, co dzieje się w czasie wykonywania.


3
Użyłem tego w jakimś kodzie dzisiaj, ale musiałem activeTimerszmniejszyć, gdy nieclearTimeout został wywołany. Można to łatwo osiągnąć, zastępując drugą linię tym: window.setTimeoutreturn window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Rick Hitchcock.

2
Ta odpowiedź nie będzie już działać, ponieważ funkcje JavaScript związane z DOM będą „niezmienne”.
John Greene,


11

Widząc, że Paul opisał tylko setTimeout, pomyślałem, że udostępnię licznik dla 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

Zamiast po prostu mieć liczbę timerów, tutaj jest implementacja, która przechowuje wszystkie identyfikatory timerów w tablicy. Pokazuje tylko aktywne liczniki, podczas gdy zaakceptowana odpowiedź liczy tylko połączenia z 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));

W ten sposób możesz uzyskać liczbę aktywnych timerów na stronie:

timers.length;

Oto jak możesz usunąć wszystkie aktywne timery :

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

Znane ograniczenia:

  • Możesz przekazać funkcję (nie ciąg znaków) tylko za setTimeoutpomocą tej małpy.
  • Funkcja zakłada clearIntervali clearTimeoutrobi to samo, co robią, ale może to zmienić w przyszłości.

Czy można uzyskać nazwy wszystkich biegaczy SetIntervals? Na przykład var timer = setInterval(function () { }potrzebuję timera zamiast liczenia interwałów biegania.
Yogesh Patel

Nie żebym o tym wiedział, sugerowałbym jednak globalne wyszukiwanie ze słowem kluczowym „setInterval” i / lub „setTimeout”
Carles Alcolea

4

Właśnie opublikowaliśmy pakiet rozwiązujący dokładnie ten problem.

npm install time-events-manager

Dzięki temu możesz przeglądać je i zarządzać nimi za pośrednictwem timeoutCollectionobiektu (i interwałów JavaScript za pośrednictwem intervalCollectionobiektu).

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


2
Myślę, że OP i większość ludzi szukała czegoś do wpisania w konsoli przeglądarki jako pierwszego PoC, a może później w rozszerzeniu. Jak można by to umieścić w konsoli na podstawie podanych przez ciebie informacji?
Carles Alcolea

1

Po prostu potrzebowałem czegoś takiego i oto co złożyłem:

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

Zapisuje przedziały czasu idwraz z ich funkcjami, a także śledzi ich status ( active/ inactive).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.