111 votes

Javascript - dire à setIntervalle de ne tirer que x fois ?

Est-il possible de limiter le nombre de fois que setInterval démarrera dans javascript ?

239voto

Daniel Vassallo Points 142049

Vous pouvez appeler clearInterval() après x appels :

var x = 0;
var intervalID = setInterval(function () {

   // Your logic here

   if (++x === 5) {
       window.clearInterval(intervalID);
   }
}, 1000);

Pour éviter les variables globales, une amélioration de ce qui précède serait :

function setIntervalX(callback, delay, repetitions) {
    var x = 0;
    var intervalID = window.setInterval(function () {

       callback();

       if (++x === repetitions) {
           window.clearInterval(intervalID);
       }
    }, delay);
}

Ensuite, vous pouvez appeler la nouvelle fonction setInvervalX() comme suit :

// This will be repeated 5 times with 1 second intervals:
setIntervalX(function () {
    // Your logic here
}, 1000, 5);

12voto

NDavis Points 390

Personnellement, je préfère utiliser setTimeout() espacé pour obtenir le même effet

// Set a function to run every "interval" seconds a total of "x" times
var x = 10;
var interval = 1000;

for (var i = 0; i < x; i++) {
    setTimeout(function () {
        // Do Something
    }, i * interval)
}

Il n'y a pas de nettoyage requis avec clearInterval()

Vous pouvez l'enfermer pour éviter les fuites de variables et il a l'air assez propre :)

// Definition
function setIntervalLimited(callback, interval, x) {

    for (var i = 0; i < x; i++) {
        setTimeout(callback, i * interval);
    }

}

// Usage
setIntervalLimited(function() {
    console.log('hit');          // => hit...hit...etc (every second, stops after 10)
}, 1000, 10)

6voto

blow Points 2374

Vous pouvez définir un délai d'attente qui appelle clearInterval. Cela devrait fonctionner :

function setTimedInterval(callback, delay, timeout){
    var id=window.setInterval(callback, delay);
    window.setTimeout(function(){
        window.clearInterval(id);
    }, timeout);
}

4voto

Jerald Macachor Points 49

Vous pouvez utiliser setTimeout et une boucle for.

var numberOfTimes = 20;
delay = 1000;

for (let i = 0; i < numberOfTimes; i++) {
    setTimeout( doSomething, delay * i);
}

1voto

Amr ElGarhy Points 12696

Cela effacera l'intervalle après 10 appels

<html>
<body>

<input type="text" id="clock" />
<script language=javascript>
var numOfCalls = 0;
var int=self.setInterval("clock()",1000);
function clock()
  {
  var d=new Date();
  var t=d.toLocaleTimeString();
  document.getElementById("clock").value=t;
  numOfCalls++;
  if(numOfCalls == 10)
     window.clearInterval(int);
  }
</script>
</form>


</body>
</html>

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