35
setInterval(function(){}, 200)

this code run the function each 200 miliseconds, how do I do it if I only want the function to be ran 10 times.

thanks for help.

bingjie2680
  • 7,643
  • 8
  • 45
  • 72

6 Answers6

90

Use a counter which increments each time the callback gets executed, and when it reaches your desired number of executions, use clearInterval() to kill the timer:

var counter = 0;
var i = setInterval(function(){
    // do your thing

    counter++;
    if(counter === 10) {
        clearInterval(i);
    }
}, 200);
karim79
  • 339,989
  • 67
  • 413
  • 406
  • 1
    @JeffreySweeney http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use – vcsjones Dec 07 '11 at 20:26
  • 1
    No, but jslint will accept `window.setInterval`. jslint will not accept the lack of space between the `function` keyword and the `()`, and other stuff, but that is another discussion altogether. jslint will not accept `++` and `--`, but we're here to help OP and not "hurt his feelings" :) – karim79 Dec 07 '11 at 20:45
  • I meant that those are actual bad practices. ++ and so on is just some guy's opinion. – Esailija Dec 07 '11 at 20:50
8
(function(){
var i = 10;
    (function k(){

        // your code here            

        if( --i ) {
        setTimeout( k, 200 );
        }

    })()
})()
mrbm
  • 1,136
  • 1
  • 12
  • 36
Esailija
  • 138,174
  • 23
  • 272
  • 326
  • 1
    +1 for using `setTimeout` instead of `setInterval`. I would probably go with `var i = 10` and `if (i--)`, but that's just me :-) – Andy E Dec 07 '11 at 20:34
5

if you want it to run for 10 times and the time it should run is every 200 miliseconds then 200X10 = 2000

var interval = setInterval(yourfunction, 200);
setTimeout(function() {
    clearInterval(interval)
}, 2000);

but it only runs 9 times so we must add more 200 miliseconds

var interval = setInterval(yourfunction, 200);
setTimeout(function() {
    clearInterval(interval)
}, 2200);

or you could run it before the setInterval

yourfunction();
var interval = setInterval(yourfunction, 200);
setTimeout(function() {
    clearInterval(interval)
}, 2000);
ThiefMaster
  • 310,957
  • 84
  • 592
  • 636
shadownrun
  • 364
  • 6
  • 15
  • 2
    i know its not safe but, the thing is the idea behind the code not how its done sorry my bad english – shadownrun Dec 26 '13 at 17:35
  • 2
    I suggest not taking the alarming comment above not too seriously, but generally passing a function is preferred. Worth nothing that passing by string is *different behaviour* (i.e. it looks for the function in the global scope) and all that's supported in older browsers. – Iain Collins Aug 19 '14 at 17:24
  • 2
    I like this solution. The only thing you should provide for the clear is variable for the times of execution, and pass the multiply as a second parameter to the `setTimeout()`. – Paul Burilichev Apr 02 '17 at 13:49
0

Just use a for loop instead, much easier:

Just try this code.

for (counter=0; counter<0; counter++) {}
Dominique
  • 16,450
  • 15
  • 56
  • 112
0

Reusable approach with options number of loop and delay time and utilize callback function

const loopInterval = ( callBack, numberOfLoop, delay ) => {  
  let counter = 0;
  let i = setInterval( ()=> {
      callBack([counter, numberOfLoop]);
      counter++;
      if(counter === numberOfLoop ) clearInterval(i);
  }, delay);
}

const runThisFunctionAsCallBack = ( x ) => console.log(`Do something here...  Loop # ${x}` )

loopInterval( runThisFunctionAsCallBack, 4, 500 )
GMKHussain
  • 3,342
  • 1
  • 21
  • 19
0

My approach is similar to JavaScripter199's (the use of a for loop) approach but with the included setInterval function. See below:

 for (let runner = 0; runner < 10; runner++) {
      setInterval(() => {

            //Some code logic of yours.

        }
      }, 200 //run every 200 milliseconds);
    }