2017-01-21 12 views
0

これは古典的なJavaScriptクロージャ対ループ変数の問題ですが、ひねりがあります。アーカイブされたつぶやきを含むMongoDBコレクションがあります。私は様々な検索語を検索して、検索操作を実行する必要があります。単語は文字列として配列に含まれているため、別々に検索しなければならず、すべての結果が単一のJSONレスポンスで返されます。MongoJSのループで繰り返し検索

最も簡単な方法は、配列を通してforループを実行して、各要素でMongoJS find()操作を実行することです。これは実際には機能し、適切なデータを返しますが、ループ変数は常に4であるため、コールバック関数内ではアクセスできません。ループの最後の値で、配列の最後の要素のインデックスです。

コールバックが呼び出されたときにループ変数が持つ正しい値を知る必要があります。誰でもこれをどうやって行うのが良い考えですか?ありがとう。あなたは何ができるか

var searchwords = ['java', 'javascript', 'ruby', 'scala', 'python']; 
    var json = new Array(); 

    for(t in searchwords) { 

     var regexp = new RegExp('\\b'+searchwords[t]+'\\b', 'gi'); 
     coll.find({ 'timestamp_ms': { $gte: String(startdate) }, 
        'timestamp_ms': { $ne: undefined }, 
        'text': regexp 
        }, function(err, docs) { 
              json.push({ 
                 'searchword': searchwords[t], 
                 'tweets': docs.length 
                }); 
              console.log(t+' : '+docs.length); 
             }); 

    } 

    res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); 
    res.end(JSON.stringify(json, null, ' ')); 

答えて

3

この

var i = 0; 
async.eachSeries(searchwords , function(word, cb){ 
    var regexp = new RegExp('\\b'+searchwords[t]+'\\b', 'gi'); 
    coll.find({ 'timestamp_ms': { $gte: String(startdate) }, 
       'timestamp_ms': { $ne: undefined }, 
       'text': regexp 
       }, function(err, docs) { 
             json.push({ 
                'searchword':searchwords[t], 
                'tweets': docs.length 
               }); 
             console.log(i+' : '+docs.length); 
             i++; 
             cb(); 
            }); 
}) 

そのない、それは一緒に呼び出しをフラッシュし、配列が大きい場合に問題があるだろうとデシベルのコールにfoorloop使用することをお勧めを使用しています。 これは、cb()が呼び出されるまで次の繰り返しが呼び出されないため、正しいインデックスを与えます。

+0

明らかに、MongoDBでわずか3時間を費やしてもまだ覚えています。 :) ありがとうございました! –

関連する問題