2012-01-05 13 views
5

Więc mam kodu, który wygląda mniej więcej tak:node.js - Oczekiwanie na wielu funkcji, aby zakończyć

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(); 

Mam spojrzał na Async biblioteki, który używam do równoległej kiedy mam określoną liczbę funkcji I trzeba uruchomić w tym samym czasie. Ale nie jestem pewien, jak osiągnąć pożądany efekt.

Wszystkie te funkcje mogą działać równolegle, po prostu muszę wiedzieć, kiedy wszystko jest gotowe.

+0

Nie jestem pewien, jeśli szukasz przyzwoita biblioteka, ale jeśli potrzebujesz tylko czegoś trywialnego, możesz po prostu mieć licznik: ustawić go na "Object.keys (data) .length" początkowo i zmniejszyć go callback '.save' - gdy osiągnie" 0 " , uruchom 'some_function()'. – pimvdb

+0

@pimvdb, który działałby (dokładnie to, o czym myślałem), ale to tylko mały hack, aby zacząć działać, aby uzyskać prawidłowy sposób robienia tego, potrzebowałbyś jakiegoś systemu powiadamiania pub/sub (aby nie uzyskać zbyt brudny z wydarzeniami i oddzwanianiem) –

Odpowiedz

8

To doskonała sprawa dla Async's forEach sposobu, który będzie realizował zadania równolegle na elementach tablicy, a następnie powołać do oddzwonienia, przykład:

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 
}); 
Powiązane problemy