2011-06-24 10 views
1

J'essaie d'apprendre l'ORM Mongoose pour MongoDB et node.js. Je souhaite interroger des documents dans ma base de données, effectuer une action sur chacun d'entre eux, puis effectuer une autre action une fois toutes les actions précédentes terminées. En d'autres termes, je veux faire quelque chose comme cela, en supposant que j'ai un modèle appelé « utilisateur: »Callbacks avec node.js/MongoDB/Mongoose

var userArray = []; 
User.find({}) 
.each(function(user) { 
    user.age += 1; 
    userArray.push(user); 
}) 
.then(function() { 
    //do something with userArray 
    //happens after all the users' ages are modified 
}); 

Quelle est la syntaxe correcte pour faire quelque chose comme ça dans Mangouste?

Répondre

2

Si vous avez seulement besoin d'effectuer des actions synchrones pour chaque document, la solution est assez simple. (Console.warn() est synchrone, de sorte que vous pouvez l'utiliser pour vérifier que tous les objets utilisateur sont traités en premier.)

User.find({}).execFind(function(err, users) { 
    users.forEach(function(user) { 
      user.age += 1; 
      userArray.push(user); 
      console.warn('x'); 
    }); 
    // then... 
    console.warn('y'); 
}); 

Si vous devez effectuer une sorte d'action asynchrone (peut-être une autre requête db), la la solution devient plus complexe. J'ai récemment rencontré ce problème et brièvement discuté en utilisant un module tel que Step ou en roulant ma propre solution barebones. Step a fourni plus de fonctionnalités que nécessaire, j'ai donc décidé que les frais généraux ajoutés n'en valaient pas la peine. Voici ma solution:

var count = 0; 
A.find({ b : c }, ['d', 'e', 'f']).sort(['d'], -1).execFind(function(err, g) { 
    g.forEach(function(h) { 
     h.a = []; 
     B.find({ b : c }, ['d', 'e', 'f', 'g']).execFind(function(err, z) { 
      g.v = z; 
      if (++count == g.length) 
       res.render('z.jade', { locals : { title : 'Q', j : g } }); 
     }); 
    }); 
}); 

S'il vous plaît pardonnez le faux-fuyants (je tirai ce droit de la source d'un projet qui est sous-wraps). Essentiellement, vous attendez la fin de l'opération asynchrone finale.

1

Il existe des modules pour cela. Essayez d'utiliser async (https://github.com/caolan/async). Il permet d'exécuter des commandes et ensuite d'exécuter un rappel une fois que tout est fait.

async.parallel([ 
    function(){ ... }, 
    function(){ ... } 
], callback);