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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top