没有分期工作。这是正常的吗?

时间:2013-07-13 08:57:19

标签: javascript node.js

例如,在处理来自数据库的数据并将它们写入某个数组的复杂循环之后,我需要处理来自数组的数据。会发生什么是在不等待挖掘周期(填充数组)的情况下触发数组处理的功能。一切都必须通过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');

}

抱歉我的英文不好!

1 个答案:

答案 0 :(得分:2)

首先,我建议您从当前的mongodb模块切换到更舒适的模块,例如:

我将在我的示例中使用monk,因为它可以很容易地适用于任何mongodb模块,包括native mongodb node driver

至于您的问题,您可以使用任何异步控制流管理模块来解决它,例如:

以下是使用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);
  })
}