2013-06-21 4 views
2

Avant de rendre une page, je dois faire plusieurs requêtes à mongodb. Voici comment je le fais maintenant (db.js est ma couche de traitement de base de données):Demande asynchrone complète à Mongodb via node.js

db.findUser(objid, function(result1){ 
    db.findAuthor(objid, function(result2){ 
    db.findSmthElse (objid, function(result3){ 
     res.render('template', { 
     user: result1, 
     author: result2, 
     smthelse: result2 
     }); 
    }); 
    }); 
}); 

Je suppose que cette methos tue l'idée de async. Cependant, je dois appeler res.render uniquement après que toutes les demandes ont été traitées. Comment lancer async? Dois-je utiliser la bibliothèque async comme il a été conseillé ici: multiple async mongo request in nodejs ou existe-t-il des solutions plus appropriées? Merci.

+1

Utilisez la bibliothèque async. En utilisant une solution similaire à la réponse acceptée dans le lien que vous avez fourni est le chemin à parcourir. –

+1

D'accord avec @MattCain - à moins que vous construisiez quelque chose de trivial, il est probable que vous serez obligé d'utiliser quelque chose comme async à un moment donné - pourrait aussi bien le connaître. – UpTheCreek

Répondre

0

Je suppose que ce methos tue l'idée de async

Non, ils ne le font pas. C'est exactement la façon dont les E/S asynchrones sont supposées fonctionner. Cependant, je ressens votre douleur en enchaînant plusieurs appels asynchrones. Avant que vous le sachiez, vous pouvez avoir 6 ou 7 fonctions asynchrones anonymes imbriquées.

Il y a deux critères que j'utiliserais avant d'envisager d'utiliser une bibliothèque comme async ou promise.

  1. Nombre de fonctions - c'est un peu subjectif, mais combien semble frustrant pour vous? Vous avez actuellement 3 et si vous êtes susceptible de rester à trois, alors une autre bibliothèque ne vaut probablement pas la complexité. Encore une fois, c'est subjectif et totalement mon opinion.
  2. Dépendances - si chaque méthode s'appuie sur les résultats de la précédente, elles ne peuvent pas s'exécuter en parallèle. Cependant, dans votre cas, les trois requêtes de base de données sont indépendantes et seul l'appel res.render dépend des fonctions chaînées. Votre cas d'utilisation est un bon candidat pour async.parallel à cet égard.

J'espère que cela vous aide à prendre votre décision

+0

Concernant # 2: il y a le très utile [async.waterfall] (https://github.com/caolan/async#waterfall) que vous pouvez utiliser s'il y a des dépendances. – robertklep

+0

@Brandon, robertklep Merci, les gars, je vais essayer vos solutions. Malheureusement, aucun moyen d'upvote ( –