9

I want to delay a "for loop" for a while but don't know how to do it.

For example. Let's say this "for loop" runs from 0 to 8 and after each i there should be a delay for 2 sek.

for (var i=0; i<8; i++{
  do something...
  wait for 2 sek. and go on with i=i++;
}
3
  • 1
    Can you give the details of what you're actually trying to achieve? It's likely that you'll want to use setTimeout but it's hard to say without knowing your aim. Commented Dec 12, 2014 at 12:00
  • 1
    That's not possible in JS. You have to play with functions and use setTimeout. Commented Dec 12, 2014 at 12:00
  • 3
    I guess that this thread answers what you are asking for stackoverflow.com/questions/3583724/… Commented Dec 12, 2014 at 12:01

3 Answers 3

12

You'll have to go that way:

function jsHello(i) {
    if (i < 0) return;

    setTimeout(function () {

        alert("Hello " + i);

        jsHello(--i);

    }, 2000);
}

jsHello(5);

or

function jsHello(i) {
    alert("Hello " + i);

    if (--i > -1) {
      setTimeout(function () { jsHello(i); }, 2000);
    }
}

jsHello(5);

Sign up to request clarification or add additional context in comments.

Comments

5

Javascript doesn't have a wait command. The way to get this behavior is using setTimeout:

for (var i=0; i<8; i++){
   do_something(i);
}

function do_something(j) {
  setTimeout(function() {
      tasks to do;
  }, 2000 * j);
}

Every time the function do_something() is called, it executes "tasks to do" scheduled by 2000*i milliseconds.

2 Comments

you have syntax error in your code, plus as a result you will have set of timeouts but inside all timeout callbacks i will be equal to 8
You are right. I'll modify it.
3

To resolve this task you have to use closure - immediately invoke function witch be called on every iteration with i as param, and setTimeout inside this function. In this case param you passed will be stored in scope and could be used in timeout callback:

for (var i=0; i<8; i++) (function(t) {
  window.setTimeout(function() {
   //do anything with t 
  }, t*2000)
}(i)) 

UPD

Also here is a shorten ES6 version. As let has block scope you can get rid os wrap function closure use

for (let i=0; i<8; i++){
   setTimeout(() => {
      console.log(i)
  }, 2000 * i);
}

1 Comment

Although it might add a great amount of delay for N loops, it was the easiest way

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.