web-dev-qa-db-fra.com

Comment effacer tous les intervalles?

J'utilise

varName = setInterval(function() { ... }, 1000);

pour définir quelques intervalles dans un plugin jquery que j'écris, mais lorsque le plugin est rechargé, je dois effacer ces intervalles. J'ai essayé de les stocker dans des variables, comme ceci:

(function($){
$.mosaicSlider = function(el) {
    var base = this;        
    var transitionInterval, mainInterval;

...

base.init = function() {
    mainInterval = setInverval(function() { ... }, 1000);
}

base.grid = function() {
    this.transition() = function() {
         transitionInterval = setInterval(function(...) {
    }
}

base.init();

Et j'ai essayé de tuer ces intervalles dans la fonction base.init (), comme ceci:

clearInterval(transitionInterval);
clearInterval(mainInterval);

Et comme ça:

window.oldSetInterval = window.setInterval;
window.setInterval = new function(func, interval) {  }
40
Nikolay Dyankov

Vous pourriez faire comme,

var interval_id = window.setInterval("", 9999); // Get a reference to the last
                                                // interval +1
for (var i = 1; i < interval_id; i++)
        window.clearInterval(i);
//for clearing all intervals
45
Sudhir Bastakoti

Rangez-les dans un objet. Puisque vous êtes le seul à faire ces intervalles et que vous savez ce qu'ils sont, vous pouvez les stocker et les jouer plus tard comme vous le souhaitez. Je créerais un objet dédié à cela, quelque chose comme:

var interval = {
    // to keep a reference to all the intervals
    intervals : new Set(),

    // create another interval
    make(...args) {
        var newInterval = setInterval(...args);
        this.intervals.add(newInterval);
        return newInterval;
    },

    // clear a single interval
    clear(id) {
        this.interals.delete(id);
        return clearInterval(id);
    },

    // clear all intervals
    clearAll() {
        for (var id of this.intervals) {
            this.clear(id);
        }
    }
};

Votre première question pourrait être

Pourquoi faire un objet séparé juste pour ça?

Eh bien Watson, c'est pour garder vos intervalles faits à la main liés à votre plugin/projet à l'abri des regards indiscrets, afin de ne pas jouer avec d'autres intervalles définis dans la page non liés à votre plugin.

Oui, mais pourquoi ne puis-je pas le stocker à l'intérieur de l'objet de base?

Vous le pouvez très certainement, mais je pense que cette façon est beaucoup plus propre. Il sépare la logique que vous faites dans votre base avec la logique de temporisation étrange.

Pourquoi avez-vous stocké les intervalles dans un Set et non dans un tableau?

Un accès plus rapide et un peu de code plus propre. Vous pouvez vraiment aller dans les deux sens.

58
Zirak

Initialisez la minuterie et définissez-la comme objet fenêtre. Window.Interval contiendra l'ID de la minuterie.

comme window.myInterval = setInterval(function() { console.log('hi'); }, 1000);

Pour effacer l'intervalle, vous pouvez écrire comme

if(window.myInterval != undefined && window.myInterval != 'undefined'){
    window.clearInterval(window.myInterval);
    alert('Timer cleared with id'+window.myInterval);
}
8
Shujaath Khan