Hurricane Development
Hurricane Development

Reputation: 2464

make asynchronous functions within for loop run in series

So in Node.js let's say I have the following code:

for (var i = 0; i < 1000; i++) {
    someAsynchronousFunction(function(err,res) {
        // Do a bunch of stuff
        callback(null,res);
    });
}

But I want this to run synchronously. I know this is not advised in Node JS, but I am just trying to understand the language. I tried implementing the following solution, but it just ends up hanging during runtime:

for (var i = 0; i < 1000; i++) {
    var going = true;
    someAsynchronousFunction(function(err,res) {
        // Do a bunch of stuff
        callback(null,res);
        going = false;
    });
    while (going) {

    }
}

What is going wrong and what is the correct way to do this?

Upvotes: 1

Views: 385

Answers (2)

F. Kauder
F. Kauder

Reputation: 889

One of the best way to do that is to use the async library.

async.timesSeries(1000, function(n, next){
    someAsynchronousFunction(next);
});

Or you can do that with async.series() function.

.times() documentation : http://caolan.github.io/async/docs.html#.timesSeries

Upvotes: 2

Jose Hermosilla Rodrigo
Jose Hermosilla Rodrigo

Reputation: 3683

Another way to do this is using Promises to generate a sequential execution of them thanks to Array#reduce :

// Function that returns Promise that is fllfiled after a second.
function asyncFunc (x){
  return new Promise((rs, rj)=>{
    setTimeout( ()=>{
      console.log('Hello ', x);
      rs();
    }, 1000)
  });
}
// Generate an array filed with values : [0, 1, 2, 3, ...]
Array.from({length : 1000}, (el, i)=> i)
// loop througth the array chaining the promises.
.reduce( (promise, value) => 
   promise.then(asyncFunc.bind(null, value))
, Promise.resolve(null));

Upvotes: 1

Related Questions