例如,经过一个复杂的循环,从数据库中处理数据并写入某个数组,我需要处理数组中的数据。发生的情况是,没有等待挖矿周期(填充数组)就触发了数组处理的功能。一切都必须通过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');
}
抱歉我的英语不好!
最佳答案
首先,我建议您从当前的 mongodb
模块切换到更舒适的模块,例如:
我将在示例中使用 monk
,因为它可以很容易地适应任何 mongodb
模块,包括 native mongodb node driver .
至于你的问题,你可以用异步控制流管理的任何模块来解决,例如:
- > async
- 最A+/promises ,例如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);
})
}
关于javascript - 不分阶段工作。正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17628599/