¿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
Respuesta
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.
Me gusta la idea de contador. Tan sencillo. Gracias. – Prospero
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();
});
Excelentes ejemplos - gracias –
- 1. Clojure manejo de mensajes/asincrónico, multiproceso
- 2. JavaScript discreto Obfusca el manejo de eventos
- 3. ¿Manejo de eventos con PowerShell?
- 4. Manejo de eventos roscados (C#)
- 5. WeakReference y manejo de eventos
- 6. Manejo de eventos en Haskell
- 7. Retraso asincrónico de JS hasta que se cumpla una condición
- 8. Raphael JS: cómo eliminar eventos?
- 9. Manejo de eventos de trabajador de fondo
- 10. ¿Manejo de eventos jQuery para desmarcar() y desvincular() eventos?
- 11. Plugin de jQuery: manejo de eventos
- 12. Manejo de eventos de WPF User Control
- 13. Manejo de excepciones Java dentro de "eventos"
- 14. ¿El depurador JS suspende todo el ciclo de eventos JS?
- 15. Mejor PropertyChanged y PropertyChanging manejo de eventos
- 16. Manejo de eventos con C# Extension Methods
- 17. Manejo simple de eventos en MVVM
- 18. Manejo de eventos del mouse con cvSetMouseCallback
- 19. Manejo de eventos con Jython & Swing
- 20. .NET gestión del manejo de eventos
- 21. Delphi y evitar el manejo de eventos
- 22. ¿Cómo funciona el manejo de eventos internamente dentro de JavaScript?
- 23. Controlador de eventos de almacenamiento HTML5/JS
- 24. C# Eventos sin argumentos. ¿Cómo los manejo?
- 25. Manejo de JSON en plantilla JS/ERB en Rails 3
- 26. Orden de manejo de eventos de Adobe Flex/Actionscript
- 27. CreateProcess asincrónico?
- 28. Vista pasiva MVP de Webforms: manejo de eventos
- 29. Manejo de eventos de mouse en la ventana transparente condicionalmente
- 30. Manejo de eventos de Javascript no manejados por otros elementos
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 –
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