2012-01-05 8 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(); 

を、 1回に実行する必要があります。しかし、私は望む効果を達成する方法がわかりません。

これらの機能はすべて並列で実行できますが、すべてが完了した時点を知る必要があります。

+0

まともなライブラリが必要な場合は、最初は 'Object.keys(data).length'に設定し、' .save'コールバックは '0'に達したときにデクリメントします。 'some_function()'を実行します。 – pimvdb

+0

@pimvdb(それはまさに私が考えていたものでした)しかし、それを行うための正しい方法を得るためにちょっとしたハックです。パブ/サブメッセージングシステムが必要ですイベントやコールバックであまりにも面倒です) –

答えて

8

これは、配列の要素に並列タスクを実行して、コールバックを呼び出しますAsync's forEach方法、例えば、最適なケースです:あなたがAを探しているなら、私はよく分からない

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