La clé générale du traitement asynchrone est que vous souhaitez avoir une indication du moment où l'itération en cours est terminée avant de passer à l'itération suivante. Depuis les opérations réelles telles que .find()
ici eux-mêmes emploient un "rappel" qui est "appelé" lorsque l'opération est terminée avec une réponse, alors ce que vous voulez généralement faire est d'appeler quelque chose qui signifie votre fin d'itération dans la même section de code.
De manière basique, vous pouvez obtenir un résultat similaire à celui des boucles traditionnelles avec le "async.eachSeries " méthode, qui ne laissera "qu'une itération à la fois" avoir lieu :
function check (collection) {
var records = [ { body: "Test 1"}, { body: "Test 2" } ];
async.eachSeries(records,function(item,callback) {
collection.find( item, function (err, rows) {
console.log(rows);
callback(err)
});
},function(err) {
if (err) throw err;
console.log("done");
});
}
Ainsi, chacun des arguments du tableau est transmis à la fonction "itérateur" ici en tant que paramètre "élément", et un deuxième argument est une fonction "rappel" à utiliser ultérieurement. Chaque fois que l'itérateur est appelé, cet argument est passé au .find()
méthode qui à son tour a un "rappel" qui lui est propre, où la réponse "erreur" ou "documents" est donnée.
À l'intérieur de ce rappel, le "rappel" fourni par la fonction "itérateur" est ensuite appelé pour signaler l'achèvement de cette itération en cours. Cela permet à la fonction "chaque" ici de continuer et d'appeler la prochaine "itération" et de traiter l'élément de tableau suivant.
En notant votre expérience, soyez conscient de la bonne façon de noter un "tableau" en JavaScript avec le []
crochets comme indiqué. Il s'agit généralement d'une différence importante lorsque vous travaillez avec des tableaux.
Il existe d'autres variantes de "async.each" et "async.eachLimit" qui permettent tous deux un certain degré de traitement parallèle, mais la méthode "Series" fait les choses "dans l'ordre" d'une manière à laquelle vous êtes habitué avec les boucles traditionnelles.
Ainsi, lorsque les opérations de boucle sont "non bloquantes", vous devez indiquer quand cette boucle se termine avant de vouloir continuer.