2012-01-05 12 views
5

Así que tengo código que se ve algo como:Node.js - A la espera de múltiples funciones para completar

var data = someobject; 

for(var x in data){ 
    mongo.findOne({ _id:data[x]._id },function(e,post){ 
     if(post != null){ 

      post.title = 'omg updated'; 
      post.save(function(){ 
       console.log('all done updating'); 
      }); 

     } 
    }); 
} 

// I need all^those functions to be done before continuing to the following function: 
some_function(); 

He mirado en la biblioteca asíncrono, que utilizo para paralelo cuando tengo un número determinado de funciones I necesidad de ejecutar en 1 vez. Pero no estoy seguro de cómo lograr el efecto deseado.

Todas estas funciones se pueden ejecutar en paralelo, que sólo tiene que saber cuando todo está hecho.

+0

No estoy seguro de si está buscando una biblioteca decente, pero si solo necesita algo trivial, puede tener un contador: configúrelo inicialmente en 'Object.keys (data) .length' y disminuya la devolución de llamada' .save' - cuando haya alcanzado '0' , ejecuta 'some_function()'. – pimvdb

+0

@pimvdb que funcionaría (era exactamente lo que estaba pensando), sin embargo, es un pequeño truco para comenzar a funcionar, para obtener la forma correcta de hacerlo, uno necesitaría algún sistema de mensajería de pub/sub (no obtener demasiado desordenado con eventos y devoluciones de llamada) –

Respuesta

8

Este es un caso perfecto para Async's forEach método, que se ejecutará tareas paralelas en los elementos de una matriz y luego llamar a una devolución de llamada, ejemplo:

async.forEach(Object.keys(data), function doStuff(x, callback) { 
    // access the value of the key with with data[x] 
    mongo.findOne({ _id:data[x]._id },function(e, post){ 
    if(post != null){ 
     post.title = 'omg updated'; 
     post.save(callback); 
    } 
    }); 
}, function(err){ 
    // if any of the saves produced an error, err would equal that error 
}); 
Cuestiones relacionadas