Affichage de tous les délais / intervalles en javascript?

88

J'écris une application qui utilise des délais et des intervalles JavaScript pour mettre à jour la page. Existe-t-il un moyen de voir combien d'intervalles sont configurés? Je veux m'assurer que je ne vais pas accidentellement tuer le navigateur en configurant des centaines d'intervalles.

Est-ce même un problème?

Omar Kooheji
la source

Réponses:

77

Je ne pense pas qu'il y ait un moyen d'énumérer temporisateurs actifs, mais vous pouvez remplacer window.setTimeoutet window.clearTimeoutles remplacer par vos propres implémentations qui font un certain suivi et appellent les originaux.

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

Bien sûr, vous ne pouvez pas toujours appeler clearTimeout, mais cela vous donnerait au moins un moyen de suivre ce qui se passe au moment de l'exécution.

Paul Dixon
la source
3
J'ai utilisé ceci dans un certain code aujourd'hui, mais j'avais besoin activeTimersde décrémenter quand il clearTimeoutn'était pas appelé. C'est facilement accompli en remplaçant la deuxième ligne de window.setTimeoutpar ceci: return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Rick Hitchcock
2
Cette réponse ne pourra plus fonctionner car les fonctions JavaScript liées au DOM seront «immuables».
John Greene
29

J'ai créé une extension Chrome DevTools qui montre tous les intervalles. Ceux qui sont effacés sont grisés.

Extension Timers Chrome Devtool

setInterval-sniffer

NVI
la source
10
Malheureusement, cela semble avoir cessé de fonctionner avec Chrome.
Joseph Lennox
@JosephLennox Cette alternative fonctionne, testée tout à l'heure: chrome.google.com/webstore/detail/timeouts-and-intervals
Trever Thompson
@TreverThompson cela ne fonctionne pas non plus.
SeyyedKhandon il y a
11

Étant donné que Paul n'a couvert que setTimeout, j'ai pensé partager un compteur pour 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);
};
crv
la source
9

Au lieu de simplement avoir un nombre de minuteries, voici une implémentation qui stocke tous les identificateurs de minuterie dans un tableau. Il n'affiche que les minuteries actives tandis que la réponse acceptée ne compte que les appels vers 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));

Voici comment obtenir le nombre de minuteries actives sur la page:

timers.length;

Voici comment supprimer tous les minuteurs actifs :

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

Limitations connues:

  • Vous ne pouvez passer une fonction (pas une chaîne) à setTimeoutavec ce patch de singe.
  • La fonction suppose clearIntervalet clearTimeoutfait la même chose, ce qu'elle fait, mais cela pourrait changer à l'avenir.
A1rPun
la source
Est-il possible d'obtenir le nom de tous les exécutants SetIntervals? Par exemple, var timer = setInterval(function () { }j'ai besoin d'une minuterie au lieu du nombre d'intervalles en cours d'exécution.
Yogesh Patel
Pas que je sache, je suggérerais une recherche globale avec le mot-clé "setInterval" et / ou "setTimeout"
Carles Alcolea
4

Nous venons de publier un package résolvant exactement ce problème.

npm install time-events-manager

Avec cela, vous pouvez les afficher et les gérer via un timeoutCollectionobjet (et les intervalles de javascript via un intervalCollectionobjet).

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

Ziv Polack
la source
2
Je pense qu'OP et la plupart des gens cherchaient quelque chose à taper dans la console du navigateur en tant que premier PoC et peut-être plus tard dans une extension. Comment ferait-on pour mettre cela dans la console à partir des informations que vous avez données?
Carles Alcolea
1

J'avais juste besoin de quelque chose comme ça et c'est ce que j'ai mis en place:

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

Cela enregistre les intervalles idavec leurs fonctions, et garde également une trace de leur état ( active/ inactive).

akinuri
la source