繁体   English   中英

使用node.js / MongoDB / Mongoose进行回调

[英]Callbacks with node.js/MongoDB/Mongoose

我正在尝试为MongoDB和node.js学习Mongoose ORM。 我想查询数据库中的文档,对每个数据库执行一个操作,然后在完成所有前面的操作之后执行另一个操作。 换句话说,假设我有一个名为“用户:”的模型,我想做这样的事情

var userArray = [];
User.find({})
.each(function(user) {
    user.age += 1;
    userArray.push(user);
})
.then(function() {
    //do something with userArray
    //happens after all the users' ages are modified
});

在猫鼬中做这样的事情的正确语法是什么?

如果只需要对每个文档执行同步操作,则解决方案非常简单。 (console.warn()是同步的,因此您可以使用它来验证是否首先处理了所有用户对象。)

User.find({}).execFind(function(err, users) {
     users.forEach(function(user) {
          user.age += 1;
          userArray.push(user);
          console.warn('x');
     });
     // then...
     console.warn('y');
});

如果您需要执行某种异步操作(也许是另一个数据库查询),则解决方案将变得更加复杂。 我最近遇到了这个问题,并使用诸如Step之类的模块或推出了自己的准系统解决方案进行了简短的辩论。 Step提供的功能超出了我的需要,因此我认为增加开销并不值得。 这是我的解决方案:

    var count = 0;
A.find({ b : c }, ['d', 'e', 'f']).sort(['d'], -1).execFind(function(err, g) {
    g.forEach(function(h) {
        h.a = [];
        B.find({ b : c }, ['d', 'e', 'f', 'g']).execFind(function(err, z) {
            g.v = z;
            if (++count == g.length)
                res.render('z.jade', { locals : { title : 'Q', j : g } });
        });
    });
});

请原谅我的混淆(我从包装不足的项目的源头中删除了该名称)。 本质上,您要等到最后的异步操作完成。

有用于此的模块。 尝试使用异步(https://github.com/caolan/async)。 它允许运行命令,然后在完成所有操作后执行回调。

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM