怎么在forEach里的所有mongoose的回调都执行完毕后, 才返回给客户端执行完毕?
 发布于 11 年前  作者 gclsoft  6027 次预览  最后一次回复是 11 年前  来自  
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 回复
think2011
docMen.forEach(function(o) {
    // 略过
});

res.send({ret: 'ok'});

不太了解 mongoose 不过forEach是同步的,这样应该没有问题吧?

如果提前输出了,你要的解决方案的关键点应该不在forEach这里。

Treri
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看看这种用法行不行?

MiguelValentine

直接用FOR i=docMen.length-1 的时候

                docUser.save(function(err) {
                    if (err) {
                        console.log("save Lists setAnswer error!");
                    } else {
                           res.send({    ret: 'OK'   });
                    }
                });
xiuxu123

用async的map方法就解决了。可以去看下api就明白了!