怎么在forEach里的所有mongoose的回调都执行完毕后, 才返回给客户端执行完毕?
发布于 10 年前 作者 gclsoft 5223 次浏览 最后一次编辑是 8 年前
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 来处理这种并发回调吧

https://github.com/alsotang/eventr#map-array-to-another

直接用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就明白了!

回到顶部