Vous ne pouvez pas mélanger synchrone et asynchrone en JavaScript ; si vous bloquez le script, vous bloquez le Navigateur.
Il faut aller jusqu'au bout de la démarche événementielle ici, heureusement on peut cacher les trucs moches.
EDIT : Mise à jour du 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;
}
Cela nous permettra d'avoir un système asynchrone loop
Vous pouvez bien sûr le modifier encore plus pour prendre par exemple une fonction pour vérifier la condition de la boucle, etc.
Passons maintenant au 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')}
);
Et le résultat :
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
128 votes
Wow
( /* ... */ )
ressemble à un monstre et j'ai peur maintenant :(