59 votes

Comment faire en sorte qu'un setInterval s'arrête après un certain temps ou après un certain nombre d'actions ?

J'ai créé une boucle de "changement de mots" avec jQuery en utilisant le code dans cette réponse : jQuery : Trouver un mot et le changer toutes les quelques secondes

Comment l'arrêter après un certain temps ? Disons après 60 secondes ou après qu'il ait parcouru la boucle ?

(function() {

  // List your words here:
  var words = [
      'Lärare',
      'Rektor',
      'Studievägledare',
      'Lärare',
      'Skolsyster',
      'Lärare',
      'Skolpsykolog',
      'Administratör'
    ],
    i = 0;

  setInterval(function() {
    $('#dennaText').fadeOut(function() {
      $(this).html(words[i = (i + 1) % words.length]).fadeIn();
    });
    // 2 seconds
  }, 2000);

})();

154voto

Mark Rhodes Points 3114

Pour l'arrêter après un certain nombre d'exécutions, il suffit d'ajouter un compteur à l'intervalle, puis lorsqu'il atteint ce nombre, de l'effacer.

par exemple

var timesRun = 0;
var interval = setInterval(function(){
    timesRun += 1;
    if(timesRun === 60){
        clearInterval(interval);
    }
    //do whatever here..
}, 2000); 

Si vous voulez l'arrêter après un certain temps (par exemple 1 minute), vous pouvez le faire :

var startTime = new Date().getTime();
var interval = setInterval(function(){
    if(new Date().getTime() - startTime > 60000){
        clearInterval(interval);
        return;
    }
    //do whatever here..
}, 2000);

1 votes

Mais si //do whatever here prend plus de 2 secondes ?

2 votes

Cela n'a pas d'importance, c'est synchrone - il fera les choses dans la fonction puis il attendra 2s. Donc l'ensemble prendra plus que le nombre de fois où la fonction est exécutée, multiplié par 2s.

0 votes

Elle fait une animation. Votre fonction n'attendra pas la fin de l'animation, sauf si vous la placez dans le callback de l'animation.

9voto

ShankarSangoli Points 45345

Utilisez clearInterval pour effacer l'intervalle. Vous devez passer l'ID de l'intervalle que vous obtenez à partir de setInterval méthode.

Par exemple

var intervalId = setInterval(function(){
                    ....
                 }, 1000);

Pour effacer l'intervalle ci-dessus, utilisez

clearInterval(intervalId);

Vous pouvez modifier votre code comme ci-dessous.

(function(){

    // List your words here:
    var words = [
        'Lärare',
        'Rektor',
        'Studievägledare',
        'Lärare',
        'Skolsyster',
        'Lärare',
        'Skolpsykolog',
        'Administratör'
        ], i = 0;

    var intervalId = setInterval(function(){
        $('#dennaText').fadeOut(function(){
            $(this).html(words[i=(i+1)%words.length]).fadeIn();
            if(i == words.length){//All the words are displayed clear interval
                 clearInterval(intervalId);
            }
        });
       // 2 seconds
    }, 2000);

})();

5voto

Iftikhar Hussain Points 124

La solution la plus simple est

var intervalId =   setInterval(function() {
    $('#dennaText').fadeOut(function() {
        $(this).html(words[i = (i + 1) % words.length]).fadeIn();
    });
}, 2000); // run every 2 seconds

setTimeout(function(){
    clearInterval(intervalId);
},10000) // stop it after 10seconds

2voto

Walid Bousseta Points 396

Je travaille avec VueJs et je voulais supprimer un div après quelques secondes ; voici ce que j'ai fait, j'espère que cela pourra aider quelqu'un ;).

export default {
  name: "Home",
  components: {},
  data() {
    return {
      removeAlert: false,
    };
  },
  methods: {
    removeAlertF() {
      let wait = window.setInterval(() => {
        this.removeAlert = true;
        console.log("done");
        if(true){
          window.clearInterval(wait);
        }
      }, 3000);
    },
  },
  mounted() {
    this.loadData();
    this.removeAlertF();
  },
};

<style>
.remove-alert {
  display: none;
}
</style>

 <div
        :class="removeAlert ? 'remove-alert' : ''"
        role="alert"
      >
        Data loaded successfully
      </div>

2voto

AlienWebguy Points 42370

Vous devriez envisager d'utiliser un système récursif setTimeout() au lieu de setInterval() pour éviter une situation de course.

var fadecount = 1;
(function interval(){  
    $('#dennaText').fadeOut(function(){
        $(this).html(words[i=(i+1)%words.length]).fadeIn('fast',function(){
            if (fadecount < 30){
                fadecount += 1;
                setTimeout(interval, 2000);
            }
        });
    });
}());

0 votes

Bon point, bien que l'apparence soit différente, je suppose que vous devriez modifier la valeur 2000, en enlevant le temps nécessaire à la réalisation de l'animation.

0 votes

C'est à l'OP de décider. 2000ms, 1700ms, peu importe. À ce stade, il s'agit d'un ajustement de la configuration.

0 votes

Un setTimeout récursif sans fin conduira à un débordement de pile à terme : medium.com/@devinmpierce/recursive-settimeout-8eb953b02b98

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X