1

たとえば、データベースからのデータを処理して特定の配列に書き込む複雑なサイクルの後、配列からのデータを処理する必要があります。何が起こるかというと、マイニング サイクル (配列への入力) を待たずに、配列処理の関数がトリガーされます。setTimeout (); を介してすべてを行う必要があります。これは正常ですか?

checkDialog: function (data, callback) {
    var interlocutorsArray = JSON.parse(data);
    var dialogsId = {};
    mongoclient.open(function (err, cursor) {

        var db = cursor.db('messages');
        var dialogsDb = db.collection('dialog');
        interlocutorsArray.forEach(function (item, index) {
            dialogsDb.find({
                owner: item.owner_user_id,
                viewer: item.viewer_user_id
            }, function (err, cursor) {
                cursor.count(function (err, count) {
                    if (count === 0) {
                        dialogsDb.insert({
                            owner: item.owner_user_id,
                            viewer: item.viewer_user_id
                        }, function (err, inserting) {
                            dialogsId[inserting[0]._id] = {
                                owner: item.owner_user_id,
                                viewer: item.viewer_user_id
                            };
                        });
                    } else {
                        cursor.each(function (err, item) {
                            if (item !== null) {
                                dialogsId[item._id] = {
                                    owner: item.owner,
                                    viewer: item.viewer
                                };
                            }
                        });
                    }
                });
            });
        });
    });

    setTimeout((function () {
        callback(dialogsId);
    }), 150);

    console.log('after callback');

}

私の悪い英語でごめんなさい!

4

1 に答える 1

2

mongodbまず、現在のモジュールから次のようなより快適なものに切り替えることをお勧めします。

ネイティブの mongodb node driverを含む任意のモジュールmonkに簡単に適応できるため、私の例で使用します。mongodb

問題に関しては、次のような非同期制御フロー管理用のモジュールで解決できます。

問題を解決する例を次に示しますasync.js

checkDialog: function (data, callback) {
  var db = require('monk')('localhost/messages');
  var dialogsDb = db.get('dialog');
  var interlocutorsArray = JSON.parse(data);

  async.concat(interlocutorsArray, function (item, next) {
    var query = {
      owner: item.owner_user_id
      viewer: item.viewer_user_id
    };
    dialogsDb.find(query, function (err, docs) {
      if (err) return next(err);
      if (docs && docs.length > 0) {
        next(null, docs);
      } else {
        dialogsDb.insert(query, function (err, inserting) {
          next(err, [inserting]);
        })
      }
    })
  }, function (err, items) {
    if (err) throw err; // it's best to handle errors without throwing them
    var dialogsId = {};
    for (var item, i = 0; i < items.length; i++) {
      item = items[i];
      dialogsId[item._id] = {
        owner: item.owner,
        viewer: item.viewer
      };
    }
    callback(dialogsId);
  })
}
于 2013-07-13T10:11:29.493 に答える