【问题标题】:How to handle async with MongoDB and node.js?如何处理与 MongoDB 和 node.js 的异步?
【发布时间】: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


【解决方案1】:

您的 for 循环具有所有顺序和同步操作。它总是会在你的 mongo 更新被触发之前完成。

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 2012-10-24
    • 2012-03-21
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2012-12-27
    • 2015-05-22
    相关资源
    最近更新 更多