2

試験の問題を解決しようとしているため、試験コードをそのまま投稿することはできません。そのため、理解できないコアコンセプトに対処するように単純化しました。基本的に、mongo コードが追いつくことができるように、ノードの非同期実行を遅くする方法がわかりません。コードは次のとおりです。

MongoClient.connect('mongodb://localhost:27017/somedb', function(err, db) {
  if (err) throw err;
  var orphans  = [];
  for (var i; i < 100000; i++) {
    var query = { 'images' : i };
    db.collection('albums').findOne(query, function(err, doc_album) {
        if(err) throw err;
        if (doc_album === null) {
          orphans.push(i);
        }
    });
  }
  console.dir(orphans.length);
  return db.close();
});

そのため、クエリ基準に一致しない画像の配列を作成しようとしています。ノードはコールバックが終了するのを待たないため、orphans.length の値は 0 になります。クエリ基準を満たさなかった配列内の画像の数をカウントする前に、コールバックの実行が終了するようにコードを変更するにはどうすればよいですか?

お時間をいただきありがとうございます。

バーラト

4

4 に答える 4

0

あなたが知っているので、コールが戻ってくるのを待ちません。console.dirコールバック関数内で 実行できます。これは機能するはずです(ただし、テストしていません)

    db.collection('albums').findOne(query, function(err, doc_album) {
        if(err) throw err;
        if (doc_album === null) {
          orphans.push(i);
        }
        console.dir(orphans.length);
    });
于 2013-09-27T05:18:10.057 に答える
0

何も遅くする必要はありません。単純にアルバム コレクションから 100,000 枚の画像を読み込もうとしている場合は、非同期フレームワークの使用を検討できます。これにより、ジョブが完了するまでタスクを割り当てることができます。

また、おそらく 100,000 件のレコードを 1 つずつ要求したくないでしょう。代わりに、おそらくそれらをページングする必要があります。

于 2013-09-27T05:18:53.987 に答える