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