怎么在forEach里的所有mongoose的回调都执行完毕后, 才返回给客户端执行完毕?
docMen.forEach(function(o) {
Users.findOne({
"_id": o.user // ,"_id": ObjectId(listId)
}, null, function(err, docUser) {
if (err) {
console.log('find docUser error!');
}
docUser.money = docUser.money+1;
docUser.save(function(err) {
if (err) {
console.log("save Lists setAnswer error!");
} else {
console.log("save Lists setAnswer OK!");
}
});
});
});
//res.send({
// ret: "OK"
//});
怎么在forEach里的所有mongoose的回调都执行完毕后, 才返回给客户端执行完毕?
5 回复
docMen.forEach(function(o) {
// 略过
});
res.send({ret: 'ok'});
不太了解 mongoose
不过forEach是同步的,这样应该没有问题吧?
如果提前输出了,你要的解决方案的关键点应该不在forEach这里。
var Promise = require('bluebird')
;
Promise.each(docMen, function(o){
return User.findOne({
_id: o.user
})
.exec()
.then(function(docUser){
docUser.money = docUser.money+1;
return Promise.promisify(docUser.save, docUser)();
});
})
.then(function(){
res.send({
ret: 'OK'
});
});
LZ看看这种用法行不行?
楼主,用 eventr 来处理这种并发回调吧
直接用FOR i=docMen.length-1 的时候
docUser.save(function(err) {
if (err) {
console.log("save Lists setAnswer error!");
} else {
res.send({ ret: 'OK' });
}
});
用async的map方法就解决了。可以去看下api就明白了!