[英]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.