Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
141
rated 0 times [  148] [ 7]  / answers: 1 / hits: 65705  / 14 Years ago, fri, november 26, 2010, 12:00:00

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?


More From » javascript

 Answers
185

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

[#94830] Wednesday, November 24, 2010, 14 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
terrence

Total Points: 120
Total Questions: 115
Total Answers: 87

Location: England
Member since Fri, May 22, 2020
4 Years ago
terrence questions
Sat, Jun 5, 21, 00:00, 3 Years ago
Wed, Jun 17, 20, 00:00, 4 Years ago
;