Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can not set timeout in Node.js loop [duplicate]

Here, i tried to set timeout for every iteration but i could not make it because nature of nodejs. Is there any way to do that?

Thanks in advance

for (var i = 1; i <= 1000; i++) {
    setTimeout(function () { console.log('something') }, 3000); 
}
like image 783
Serhat Ates Avatar asked Mar 15 '17 13:03

Serhat Ates


2 Answers

It works but it schedules all timeouts at the same time.

If you want to schedule them at 3 sec intervals then use:

for (var i = 1; i <= 1000; i++) {
    setTimeout(function () { console.log('something') }, i * 3000);
}

If you want to use i inside of your timeout callbacks, use let instead of var like this:

for (let i = 1; i <= 1000; i++) {
    setTimeout(function () { console.log('something', i) }, i * 3000);
}

As you can see with var it would print 1001 for every line:

for (var i = 1; i <= 1000; i++) {
    setTimeout(function () { console.log('something', i) }, i * 3000);
}

And by the way, you can simplify it with arrow function syntax:

for (let i = 1; i <= 1000; i++) {
    setTimeout(() => console.log('something', i), i * 3000);
}

Another way to do it would be to do something like this - instead of scheduling all 1000 timeouts at the same time, create an interval:

(() => {
    let i = 0;
    setInterval(() => {
        i++;
        console.log('something', i);
    }, 3000);
})();

The outer closure is to keep the i variable from being visible in the outer scope. OR you can use something like this:

(() => {
    let i = 0;
    let f = () => {
        i++;
        console.log('something', i);
        setTimeout(f, 3000);
    };
    setTimeout(f, 3000);
})();

In the last example the function that is invoked as a timeout callback schedules itself every time it finishes.

There are many ways to do it and all have some pros and cons.

For example you shouldn't use setInterval if your callback could potentially run longer than the interval between invocations. It will not be a problem when you use setTimeout and schedule yourself in every callback but on the other hand you may have less precision in the intervals that way. You need to test what works best for you.

like image 51
rsp Avatar answered Sep 19 '22 10:09

rsp


for (var i = 1; i <= 10; i++) {
     wait('something', i, 10);
}

function wait(msg, i, length){
    setTimeout(function () 
    { 
    console.log(msg) ;
    }, (i * 3000));
}

try something like this. Your code actually works but you wait 3 seconds for all which will wait about 1 ms before the next iteration is done runs

like image 28
tyehia Avatar answered Sep 21 '22 10:09

tyehia