怎么在forEach里的所有mongoose的回调都执行完毕后, 才返回给客户端执行完毕?
发布于 7个月前 作者 gclsoft 388 次浏览
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看看这种用法行不行?

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

回到顶部