GTS Joe
GTS Joe

Reputation: 4182

JavaScript setTimeout in for Loop for Performance Test

I am trying to use setTimeout for a performance test using console.time() and console.timeEnd(). However, setTimeout() isn't delaying the for() loop.

Here is the JS Fiddle:

// Start the timer.
console.time('testFor');

for ( i = 0; i < 5; i++ ) {
  setTimeout( console.log('The number is ' + i), 2000 );
}

// End the timer, get the elapsed time.
console.timeEnd('testFor');

How can I make setTimeout() work in my script and why is it not working for me?

Upvotes: 0

Views: 275

Answers (3)

Sandy Gifford
Sandy Gifford

Reputation: 8136

Others have already suggested excellent solutions to your problem - I'd like to offer a closer examination of what was happening with your code.

setTimeout doesn't delay the advancement of your code (like sleep does in other languages) but instead defers running another block of code. It's a weird concept that can be hard to understand; consider the following example:

console.time("Main Program");
console.time("Defered Code");

setTimeout(deferedCode, 1000);

console.timeEnd("Main Program");

function deferedCode() {
    console.timeEnd("Defered Code");
}

If we look at the console after running this code, we'll see "Main Program" print out almost immediately, and "Defered Code" roughly a second later.

We've asked setTimeout to run the function deferedCode at a time 1000 ms in the future, and then let the rest of the code run.

Notice also that deferedCode is passed to setTimeout without (). We're passing the function itself and not the result of deferedCode to setTimeout so that setTimeout can choose when to run it.

Upvotes: 2

Andrew D
Andrew D

Reputation: 207

setTimeout is asynchronous. If you want to call a certain piece of code at regular intervals, use the setInterval function.

I think this code is close to what you are trying to do:

// Start the timer.
console.time('testFor');

var i = 0;
var finish = 5;
var t = setInterval(function() {
  if (i < finish) {
    console.log('The number is ' + i);
    i++;
  } else {
    clearInterval(t);
    // End the timer, get the elapsed time.
    console.timeEnd('testFor');
  }
}, 2000);

Upvotes: 1

PLan
PLan

Reputation: 133

You could do this without a loop, just using recursion:

var i = 0;

var logNumber = function(){
    console.log('The number is ' + i);
    i++;
    if(i < 5){
        setTimeout(logNumber, 2000);
    }
}

logNumber();

Upvotes: 1

Related Questions