2016-04-27 10 views
2

rowsArr(100レコードと言う)を非同期で処理しようとしていますが、データベース接続を避けるためにデータベースから国リストを一度だけ読み込みたいとします。私は下のコード例を試していますが、データベース接続を100回開いています。Nodejs async.each最初のループを待つ

var countryList = null; 

async.each(rowsArr, function(row, callback) { 


    if(countryList == null) 
    { 
     console.log("open database here to get country list and then assign to below variable"); 

     countryList = countriesFromDatabase; 

     callback(countryList); 
    } 
    else 
    { 
     callback(countryList); 
    } 


}, function(err){ 

     console.log("all rows are processed"); 

}); 

それは、async.eachSeriesで正常に動作しているが、私は非同期にそれをしたいです。なにか提案を?

答えて

3
  1. すべての行

だから、次のプロセスが

function getCountries(callback) { 
    console.log("open database here to get country list and then assign to below variable"); 
    callback(null,countriesFromDatabase); 
} 
getCountries(function(err, countriesFromDatabase) { 
// use countries in following async loop 
    async.each(rowsArr, function(row, callback) { 
    callback(null, row); //process row here 
    }, function(err) { 
    console.log("all rows are processed"); 
    }); 
}); 
+0

このアプローチは良いですが、上記の関数はすでに別のループの中にあります。 100レコードは1ループで処理され、数百万のレコードがあります。 –

+0

'countriesFromDatabase'を取得するまでは' row'を処理できないと仮定していますので、最初の繰り返しで 'countriesFromDatabase'を取得した場合、他の行には' countriesFromDatabase'(非同期)はありません 機能を少し変更してください – JagsSparrow

+0

これはほぼ確実に投稿された質問に対する正解です。私はこの答えがなぜ機能しないのかを反映するために質問を編集するか、それを受け入れます。 – Ironcache

0

に動作しますデータベース

  • から国をゲットそれは実際に、すべての百の行が同時に開始を処理すべきかを行い、 ifブロックを通過しています。

    ロックを使用するとよいでしょう。 https://github.com/BorisKozo/node-async-locks

    このように、複数のデータベース接続を避けるために、あなたのcountryListチェックプロセスをロックすることができます。

  • 関連する問題