Comment synchroniser la requête asynchrone MongoDB dans NodeJS
Question
J'ai une instruction for-loop et un MongoDB asynchrone dans le corps de la boucle.Ce que je veux faire, c'est faire un find
requête à partir de ma base de données MongoDB et transférez le résultat dans un tableau.
Voici le code :
function() arrResult() {
var arr = [];
for(...) {
collection.find({ foo: i }, function (err, cursor) {
arr.push(cursor);
}
}
return arr;
}
Mais il est évident que la valeur de retour de la fonction serait un Array vide.
Je veux résoudre ce problème en utilisant Q
module.Y a-t-il des solutions ?
La solution
Je veux résoudre ce problème en utilisant le module Q.Y a-t-il des solutions ?
Oui, les promesses sont une abstraction très simple pour gérer cela.Vous pouvez exécuter les requêtes en parallèle et collecter leurs résultats avec all
.
En particulier, avec Q
cela ressemblerait à ceci :
function arrResult(…) {
var promises = [];
for (…)
promises.push( Q.ninvoke(collection, "find", {foo: i}) );
return Q.all(promises);
}
arrResult(…).then(function(arr) {
…
}, function(err) {
// first error, if any occured
});
Autres conseils
Vous avez besoin d'un mécanisme de synchronisation qui agit comme une porte de processus.Chaque requête renvoyée doit arriver à la porte, par ex.décrémente un compteur et dépose son résultat.Lorsque tout le monde est arrivé à la porte, un dernier rappel renvoie les résultats collectés.