2011-05-21 5 views
5

Est-ce que quelqu'un peut me désigner ou expliquer un type de modèle de conception basé sur un événement qui gère la situation d'attente de deux événements pour effectuer une action?
J'ai un modèle qui est chargé async et un appel de base de données qui se passe également en même temps. J'ai une réponse qui doit être exécutée uniquement lorsque ces deux tâches sont terminées.
La seule solution que je peux trouver est de faire quelque chose de moche, comme mettre en booléens qui sont définis sur la fin de l'événement et vérifier ensuite s'ils sont tous vrais. Y a-t-il une meilleure manière de faire cela?Gestion asynchrone des événements d'un nœud JS

+0

Il semble qu'ils ne devraient pas être parallèles événements asynchrones alors à moins que je manque quelque chose. Je voudrais juste faire event1 -> event1 callback -> event2 -> event2 callback -> insertion de base de données –

+0

Il s'agit d'une réponse à une demande .... analyser le template-> rendre la page <- interroger la base de données .... Je sais que est un peu trivial parce que l'analyse sera toujours plus rapide mais c'est une question d'apprentissage. – Prospero

Répondre

3

Il n'y a pas de moyen simple de le faire vraiment, mais il y a beaucoup de flow control libraries qui traitent ce genre de chose. La méthode la plus simple consiste à conserver un compteur global qui s'incrémente lorsque vous lancez un appel asynchrone, puis décrémente dans le rappel lorsqu'il se termine. Chaque opération peut vérifier le compteur quand il se termine, et si le zéro est déclenché, la réponse dépend de l'achèvement des deux.

+0

J'aime l'idée de contre. Si simple. Je vous remercie. – Prospero

8

Juste pour ajouter un exemple de l'un de Chris Réponse:

En utilisant async, https://github.com/caolan/async

async.parallel([ 
    function(callback){ 
     // query a database, lets say mongodb/mongoose 
     User.findOne({email: email}, function(err, user){ 
      callback(err, user); 
     }); 
    }, 
    function(callback){ 
     // Load a template from disk 
     fs.readFile('views/user.html', function (err, data) { 
      callback(err, data) 
     }); 
    } 
], function(err, results){ 
    // Should have [user, template data] 
}); 

Ou avec des compteurs:

var user  = false, 
    template = false, 
    count = 2; 

function build_user_view(){ 
    // user, template should be available 
} 

User.findOne({email: email}, function(err, userDoc){ 
    user = userDoc; 
    --count || build_user_view(); 
}); 


fs.readFile('views/user.html', function (err, data) { 
    template = data; 
    --count || build_user_view(); 
}); 
+0

D'excellents exemples - merci –