无法进入异步(同步)函数/空结果的回调

时间:2015-08-04 09:40:58

标签: javascript node.js asynchronous sails.js waterline

所以我使用异步,这个函数会输出一些id和计数结果但不会"回调"

    getWaitingGames: function(req,res){
    var me = req.session.passport.user;
    var rez=[];
    console.log("meeeeeeeeee");
    console.log(me);
    GivenQuestion.find().where({user_id:me}).exec(function(err,data){
        var tpm_id = data[0].partie_id;
        console.log(tpm_id);
        console.log(data);
        async.each(data, function(d, callback) {
            var parties = [];
            if (d.partie_id != tpm_id){
                console.log(d.partie_id);
                parties.push(d.partie_id);
                tpm_id=d.partie_id;
                GivenQuestion.count().where({
                    partie_id: d.partie_id,
                    user_id: me
                }).exec(function(e, countRes) {
                    console.log(countRes);
                    if (countRes==2){
                        rez.push(d.partie_id);
                        callback();
                    }
                });
            }

        }, function(err) {
            if (err) {
                console.log(error);
            }
            else{
                console.log("callback");
                res.ok(rez);
            }
        });
    });

},

为什么?我找不到想要我做错了,似乎与文档中的相同,我之前以同样的方式使用过它

编辑:是的我可以把回调放在if之后,就像你们建议的那样但是我得到一个空的rez。为什么? async只能工作一个级别吗? (我的意思是,这里我在2 .exec())

2 个答案:

答案 0 :(得分:2)

代码中存在一个小问题。对于 async.each 方法,在作为处理函数的第二个参数中,我们必须调用 callback()来移动到下一个元素。如果我们不打电话给回调(),那么永远不会失效。

在您的情况下,您仅在if (countRes==2)时拨打回拨(),但其他方案如何?在其他情况下 async.each()等待回调()来处理数据中的下一项,但由于我们没有调用callback()所以等待它

解决方案:在if (countRes==2)之外拨打 callback()。请查看以下代码段以获取更多详细信息:

GivenQuestion.count().where({
                        partie_id: d.partie_id,
                        user_id: me
                    }).exec(function(e, countRes) {
                        console.log(countRes);
                        if (countRes==2){
                            rez.push(d.partie_id);
                        }
                        callback();
                    });

如果您仍然发现问题,请退回。

答案 1 :(得分:1)

需要两个输入才能更深入地了解该问题:

  1. 您是否检查过条件 if(countRes == 2)会导致 true ?因为如果此条件评估为错误 rez 始终为空

  2. 如果 if(countRes == 2)评估为 true ,那么 d.partie_id 的值是多少情况?

  3. 请提供这些输入。

    此外, async.each 可以在多个级别上运行。我做了一个实现,我在异步内部使用async。所以,它看起来不像异步的错误。