2011-05-21 27 views
5

¿Puede alguien señalarme o explicar algún tipo de patrón de diseño basado en eventos que maneje la situación de espera en dos eventos para completar una acción?
Tengo una plantilla que se carga de forma asíncrona y una llamada a la base de datos que también está sucediendo al mismo tiempo. Tengo una respuesta que debe ejecutarse solo cuando ambas tareas se hayan completado.
La única solución que se me ocurre es hacer algo feo, como poner los booleanos establecidos en verdadero en el final del evento y luego verificar si son verdaderos. ¿Hay una mejor manera de hacer esto?Manejo asincrónico de eventos JS

+0

Parece que no deben ser paralelas eventos asincrónicos a menos que me falta algo. Me gustaría hacer event1 -> event1 callback -> event2 -> event2 callback -> database insert –

+0

Es una respuesta a la solicitud ... analizar la plantilla-> renderizar la página <- consultar la base de datos ... Sé que es un poco trivial porque el análisis siempre será más rápido, pero es una pregunta de aprendizaje. – Prospero

Respuesta

3

No hay una manera simple de hacer esto realmente, pero hay muchos flow control libraries que manejan este tipo de cosas. La forma más simple podría ser mantener un contador global que se incrementa al iniciar una llamada asincrónica, luego disminuye en la devolución de llamada cuando finaliza. Cada operación podría verificar el contador cuando termine, y si es cero activará la respuesta que depende de que ambos se completen.

+0

Me gusta la idea de contador. Tan sencillo. Gracias. – Prospero

8

sólo para añadir un ejemplo de cualquiera de Chris' respuesta:

El uso asíncrono, 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] 
}); 

O con los contadores:

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

Excelentes ejemplos - gracias –

Cuestiones relacionadas