2012-01-05 84 views
5

所以我有一些代碼看起來像:的Node.js - 等待多個函數來完成

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

我已經看着異步庫,我使用的並行時,我有功能的一組號碼我需要一次運行。但我不確定如何達到預期效果。

所有這些功能可以並行運行,我只需要知道什麼時候完成。

+0

我不知道,如果你正在尋找一個體面的庫,但如果你只需要一些微不足道的東西,你可以擁有一個計數器:開始時將它設置爲Object.keys(data).length',當它達到'0'時將'save'回調減少 - ,運行'some_function()'。 – pimvdb 2012-01-05 14:40:45

+0

@pimvdb會工作(這正是我想的),但它只是一個小小的黑客啓動和運行,以獲得正確的方式做這件事需要一些酒吧/消息系統(不要得到過於混亂的事件和回調) – 2012-01-05 14:52:30

回答

8

這是Async's forEach方法,這將在一個數組中的元素進行並行任務,然後調用回調,例如一個完美的案例:

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