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?
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 .
for loop is synchronous.
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.
JavaScript is a single-threaded, non-blocking, asynchronous, concurrent programming language with lots of flexibility.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With