Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Asynchronous for cycle in JavaScript

Tags:

javascript

I need a loop that waits for an async call before continuing. Something like:

for ( /* ... */ ) {    someFunction(param1, praram2, function(result) {      // Okay, for cycle could continue    })  }  alert("For cycle ended"); 

How could I do this? Do you have any ideas?

like image 750
Marry Hoffser Avatar asked Nov 26 '10 21:11

Marry Hoffser


People also ask

Can we use async await in for loop?

log('End') before the promises in the forEach loop gets resolved. JavaScript does this because forEach is not promise-aware (you can't return values in a forEach loop). It cannot support async and await . You cannot use await in forEach .

Is for loop synchronous or asynchronous?

for loop is synchronous.

Is JavaScript for loop asynchronous?

For loops. Combining async with a for (or a for...of ) loop is possibly the most straightforward option when performing asynchronous operations over array elements. Using await inside a for loop will cause the code to stop and wait for the asynchronous operation to complete before continuing.

Can JavaScript be asynchronous?

JavaScript is a single-threaded, non-blocking, asynchronous, concurrent programming language with lots of flexibility.


1 Answers

You can't mix synchronous and asynchronous in JavaScript if you block the script, you block the Browser.

You need to go the full event driven way here, luckily we can hide the ugly stuff away.

EDIT: Updated the code.

function asyncLoop(iterations, func, callback) {     var index = 0;     var done = false;     var loop = {         next: function() {             if (done) {                 return;             }              if (index < iterations) {                 index++;                 func(loop);              } else {                 done = true;                 callback();             }         },          iteration: function() {             return index - 1;         },          break: function() {             done = true;             callback();         }     };     loop.next();     return loop; } 

This will provide us an asynchronous loop, you can of course modify it even further to take for example a function to check the loop condition etc.

Now on to the test:

function someFunction(a, b, callback) {     console.log('Hey doing some stuff!');     callback(); }  asyncLoop(10, function(loop) {     someFunction(1, 2, function(result) {          // log the iteration         console.log(loop.iteration());          // Okay, for cycle could continue         loop.next();     })},     function(){console.log('cycle ended')} ); 

And the output:

Hey doing some stuff! 0 Hey doing some stuff! 1 Hey doing some stuff! 2 Hey doing some stuff! 3 Hey doing some stuff! 4 Hey doing some stuff! 5 Hey doing some stuff! 6 Hey doing some stuff! 7 Hey doing some stuff! 8 Hey doing some stuff! 9 cycle ended 
like image 61
Ivo Wetzel Avatar answered Sep 30 '22 21:09

Ivo Wetzel