【发布时间】:2014-04-10 10:14:07
【问题描述】:
在此代码 sn-p 中确保 for 循环完成其处理在更新 MongoDB 数据库之前的最佳方法是什么:
var userIdArray = [] // contains 100000 userIds
User.find({'_id': {$in: userIdArray}}, 'name', function(err, result){
var thisTime = new Date().getTime();
var usersArray = [];
for (var i = 0; i < result.length; i++) {
var user = result[i];
var userObject = {
userId: user['_id'],
userName: user.name,
time: thisTime
}
usersArray.push(userObject);
};
Model.update(id,
{$pullAll: {userIds: userIdArray}, $push: {users: {$each: usersArray}}},
function(err, result) {
//continue to do stuff
}
);
});
【问题讨论】:
-
异步操作 (
Model.update) 总是在 for 循环之后执行。因为您的for循环中没有任何异步内容。见:stackoverflow.com/questions/16336367/… -
@TheBronx 谢谢你!那么如果在 for 循环中还有另一个 MongoDB 数据库调用,那会改变这种情况吗?
-
当然
Model.update会在循环中的同步操作之后执行,但并不总是在你添加的异步任务之后执行。一旦您的同步代码被执行(即,一旦Model.update任务被排队),Node.js 将“检查”已完成的异步任务,并将执行它的回调。您可以在此处阅读有关 Node.js 中 事件循环 的更多信息:blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop
标签: javascript node.js mongodb asynchronous mongoose