2016-07-22 20 views
0

データベースを停止し、オブジェクトのリストを返す関数を作成しようとしています。すべてのクエリの結果。Nodejsでコールバック関数を呼び出す前にN個のクエリが終了するのを待つ方法

すべてのクエリが完了するのを待つ方法、またはそれらを同期的に行う方法はありますか?もしそうなら、どのように?私はそれらがすべて選択クエリであり、お互いに依存しないので、時間を最適化するためにそれらを並列に実行するという事実を悪用するべきではありませんか?それは悪いデザインですか?または多分私はこれにストアドプロシージャを使用する必要がありますか?

getTopActiveUsers:function(callback) { 
    pool.connect(function (err, client, done) { 
     if (err) 
      callback(null, err); 
     else { 
      User.finAll(client,function(users) { 
       for(var i=0;i<users.length;i++) { 
        Application.findByUser(users[i].id,function(applications) { 
         // here i have the applications for user i 
        }) 
       } 
       // need to call the callback function when all queries finishes 
      }) 
     } 
    }); 
} 

答えて

3

非同期ライブラリはあなたのためです。 parallelメソッドは、すべてのリクエストを並行して実行し、すべてのリクエストが完了するのを待ちます。

getTopActiveUsers : function(callback) { 
pool.connect(function(err, client, done) { 
    if (err) { 
     callback(null, err); 
    } else { 
     User.finAll(client, function(users) { 
      var requests = []; 

      for (var i = 0; i < users.length; i++) { 
       requests.push(function(asyncCallback) { 
        Application.findByUser(users[i].id, function(applications) { 
         // here i have the applications for user i 
         asyncCallback(); 
        }); 
       }); 

      } 

      async.parallel(requests, function(err) { 
       // Requests are finished here 
      }); 
     }) 
    } 
}); 
} 

ドキュメント:http://caolan.github.io/async/

1

これらはすべてが並列で実行することができますので、あなたが既に持っているコードで最も簡単な方法は、ちょうどカウンター維持することです:

getTopActiveUsers:function(callback) { 
    pool.connect(function (err, client, done) { 
     if (err) 
      callback(null, err); 
     else { 
      User.findAll(client,function(users) { 
       var doneCnt = 0; 
       for(var i=0;i<users.length;i++) { 
        Application.findByUser(users[i].id,function(applications) { 
         // here i have the applications for user i 
         ++doneCnt; 
         if (doneCnt === users.length) { 
          callback(null, someResult); 
         } 
        }) 
       } 
      }) 
     } 
    }); 
} 

詳細高度な(より柔軟な)メカニズムは、データベースへの約束ベースのインターフェイスを学習して使用することで、Promise.all()を使用して、複数の非同期操作がいつ行われるかを追跡できます。

関連する問題