user3286309
user3286309

Reputation: 1

setInterval within a for-loop not working

What I want is an infinite loop that alerts 1, 2, 3, 1, 2, 3, ... with an interval of 2000 milliseconds. But it's not working. The console's not showing any error though. What's the problem here?

for (i = 1; i <= 3; i++) {
    setInterval(function() {
        alert(i);
    }, 2000);

    if (i == 3) {
        i = 0;
    }
}

Upvotes: 0

Views: 1696

Answers (5)

my best suggestion is . use event monogramming righterthen loop , first make a function then after completing of setInterval call to next function and so on.. that's how u can solve this p

Upvotes: 0

joseeight
joseeight

Reputation: 924

The reason why this is not working is because you enter the infinite loop in a blocking state, meaning that the interval is never entered as the browser is busy looping. Imagine the browser can only do one thing at a time, as in a single thread, so the loop is it, and cannot do anything else until it's done, and in your case it never is, therefore the interval is waiting for it's turn, which it never gets.

You could make it none blocking like this:

function recursion () {
    for (var i = 1; i < 4; i++) {
        var num = i;
        setInterval(function() {
            console.log(String(this));
        }.bind(num), 2000);
    }
    recursion ();
}
recursion ();

Upvotes: 0

java seeker
java seeker

Reputation: 1266

   you can not setInterval() inside a for loop because it will create multiple timer instance.

The setInterval() method calls a function or evaluates an expression at specified intervals (in milliseconds).

The setInterval() method will continue calling the function until clearInterval() is called, or the window is closed.

The ID value returned by setInterval() is used as the parameter for the clearInterval() method.

Tip: To execute a function only once, after a specified number of milliseconds, use the setTimeout() method.

    var i = 0
    function test() {
        i = i % 3; 
        ++i;
        alert(i);
    };

    setInterval('test()', 2000);

Upvotes: 1

Amit Joki
Amit Joki

Reputation: 59232

This will do:

var i = 0;
setInterval(function () {
    i += 1;
    if (i == 4) {
        i = 1;
    }
    alert(i);
}, 2000);

I've checked it chrome too.

It outputs 1,2,3,1,2,3... as you have requested.

Upvotes: 1

ced-b
ced-b

Reputation: 4065

You would not need a loop for this, an interval already goes on infinitley. Try this instead:

var i = 1;

setInterval(function() {
    alert(i);

    i++;

    if(i > 3) {
      i = 1;
    }
}, 2000);

Upvotes: 0

Related Questions