【问题标题】:Cannot enter in callback of async (synchronous) function / empty result无法进入异步(同步)函数的回调/空结果
【发布时间】:2015-08-04 09:40:57
【问题描述】:

所以我使用的是异步,这个函数会输出一些 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。为什么? 异步是否只工作一个级别? (我的意思是,我在 2 .exec() 里面)

【问题讨论】:

  • 如果countRes!=2 你没有打电话给callback()。看起来您应该将 callback() 移到 if 语句之外,以便每次迭代 async.each 时都会调用它。

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


【解决方案1】:

代码中有一个小问题。在 async.each 方法的情况下,在第二个参数是一个处理函数中,我们必须调用 callback() 来移动到下一个元素。如果我们不调用 callback() 那么 if 永远不会退出函数。

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

解决方案:在 if (countRes==2) 之外调用 callback()。详情请查看以下代码 sn-p:

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();
                    });

如果您仍然发现问题,请恢复。

【讨论】:

  • 确实,如果我这样做,问题是 rez 是空的。可能是因为我在另一个 exec 内部的 exec 内部?也许 async 只在顶层有效?将用真正的问题编辑我的第一篇文章
【解决方案2】:

需要两个输入来更深入地了解问题:

  1. 您是否检查了条件 if (countRes==2) 的结果是否为 true?因为如果此条件的计算结果为 false,则 rez始终为空

  2. 如果 if (countRes==2) 计算结果为 true,那么其中 d.partie_id 的值是多少案例?

请提供这些输入。

此外,async.each 确实在多个级别上工作。我做了一个实现,我在异步中使用了异步。所以,这看起来不像是异步的错。

【讨论】:

  • 是的,条件评估为真。 d.partie_id 是参与方的 id(英文游戏)。所以,如果我还执行console.log(d.partie_id)我得到这个10 55ba5186dba2dff017e6df63 1 55ba4e16a4ad93ac1415e732 2 55ba56131451b25619151112 4 55ba4f086ee315de1552348e 1 55ba51368c14241b1751fbd5 2 55ba56131451b25619151112 4 55ba4f086ee315de1552348e还有我试图把苏亚雷斯的东西之前和之后.Count中和它的工作。但不幸的是,我需要 .count 回调中的数据
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2020-12-24
  • 1970-01-01
  • 2022-12-22
  • 2020-10-20
  • 2016-06-21
相关资源
最近更新 更多