没有阶段性的工作。 这是正常的吗?

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

对不起,我的英语不好!

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

  • mongoskin
  • mongoose

在我的例子中,我将使用monk ,因为它可以很容易地适用于任何mongodb模块,包括本地mongodb节点驱动程序 。

至于你的问题,你可以用任何模块来解决它的asynchronous控制stream程pipe理,比如:

  • asynchronous
  • 大多数A + /承诺 ,例如when.js

下面是一个解决你的问题与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); }) }