Question

J'écris une application qui utilise les délais d'attente et JavaScript intervalles pour mettre à jour la page. Est-il possible de voir combien d'intervalles sont configurés? Je veux vous assurer que je ne vais pas accidentellement tuer le navigateur en ayant des centaines de configuration des intervalles.

Est-ce même un problème?

Était-ce utile?

La solution

Je ne pense pas qu'il y ait un moyen d'énumérer temporisateurs actifs, mais vous pouvez remplacer window.setTimeout et window.clearTimeout et les remplacer par vos propres implémentations qui font un certain suivi, puis appeler 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 au moins vous donner un moyen de suivre ce qui se passe lors de l'exécution.

Autres conseils

J'ai fait une extension DevTools Chrome qui montre tous les intervalles. les défrichées sont grisés.

Timers extension Chrome Devtool

setInterval-renifleur

Voyant que Paul a seulement couvert setTimeout Je pensais que je partagerais 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);
};

Au lieu d'avoir juste un nombre de minuteries, voici une implémentation qui stocke toutes les années timerId dans un tableau. Il montre seulement timers actifs alors que la réponse acceptée compte que les appels & 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 vous pouvez obtenir le nombre de minuteries actifs sur la page:

timers.length;

Voici comment vous pouvez supprimer tous les temporisateurs actifs :

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

Limitations:

  • Vous ne pouvez passer une fonction (pas une chaîne) pour ce patch avec clearInterval de singe.
  • La fonction suppose et <=> faire la même chose <=>, ce qu'ils font, mais cela pourrait changer à l'avenir.

Nous avons juste publié un paquet résoudre cette question précise.

npm install time-events-manager

Avec cela, vous pouvez visualiser et de les gérer via objet timeoutCollection (et des intervalles de javascript par objet intervalCollection).

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

Je voulais juste quelque chose comme ça et c'est ce que je l'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);

enregistre les IDs d'intervalle avec leurs fonctions ainsi que, et assure également le suivi de leur état (actif / inactif).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top