尝试进行嵌套查询时已调用节点异步回调

宝87

尝试使用MEAN堆栈进行异步查询时,我收到了一个已被称为“回调”的错误。我需要第二个回调仅在嵌套查询完成后触发(根据代码中的注释)。为什么会出现此错误?

路线示例:

router.route('/teams/:user_id').get(function (req, res) {

TeamProfile.find({
    Members : {
        $in : [req.params.user_id]
    }
}).exec(function (err, teamProfiles) {

    var asyncTasks = [];

    teamProfiles.forEach(function (teamProfile) {
        asyncTasks.push(function (callback) {
            UserProfile.find({
                UserID : {
                    $in : teamProfile.Members.map(function (id) {
                        return id;
                    })
                }
            }, function (err, userProfiles) {
                teamProfile.Members = userProfiles;
                callback();
            })
        });
    });

    teamProfiles.forEach(function (teamProfile) {
        asyncTasks.push(function (callback) {
            Draft.find({
                _id : {
                    $in : teamProfile.Drafts.map(function (id) {
                        return id;
                    })
                }
            }, function (err, drafts) {
                teamProfile.Drafts = drafts;

                drafts.forEach(function (draft) {
                    Comment.find({
                        _id : {
                            $in : draft.Comments.map(function (id) {
                                return id;
                            })
                        }
                    }).exec(function (err, comments) {
                        draft.Comments = comments;
                        callback();
                        //This is where the callback should be called
                        //Throws Error: Callback was already called.
                    })                      
                })

            })
        });
    });

    async.parallel(asyncTasks, function () {
        res.json(teamProfiles)
    });
});
})

我正在async.parallel()执行所有查询。我对这一切都很陌生,因此请原谅一些错误。

老人

您正在drafts同步迭代callback在第一项上调用异步函数。当您尝试使用第二个项目再次调用它时出现错误,这是预期的行为。

相反,您应在完成所有草稿查询后而不是对每个草稿查询,都调用完完成的回调。由于您正在使用异步,因此可以嵌套另一个async.each来处理此问题:

router.route('/teams/:user_id').get(function (req, res) {

        TeamProfile.find({
            Members : {
                $in : [req.params.user_id]
            }
        }).exec(function (err, teamProfiles) {

            var asyncTasks = [];

            teamProfiles.forEach(function (teamProfile) {

                asyncTasks.push(function (callback) {
                    UserProfile.find({
                        UserID : {
                            $in : teamProfile.Members.map(function (id) {
                                return id;
                            })
                        }
                    }, function (err, userProfiles) {
                        teamProfile.Members = userProfiles;
                        callback();
                    });
                });
            });

            teamProfiles.forEach(function (teamProfile) {
                asyncTasks.push(function (callback) {
                    Draft.find({
                        _id : {
                            $in : teamProfile.Drafts.map(function (id) {
                                return id;
                            })
                        }
                    }, function (err, drafts) {
                        teamProfile.Drafts = drafts;

                        async.each(drafts, function(draft, draftCallback){

                            Comment.find({
                                _id : {
                                    $in : draft.Comments.map(function (id) {
                                        return id;
                                    })
                                }
                            }).exec(function (err, comments) {
                                draft.Comments = comments;
                                draftCallback();
                            });

                        }, function(err){
                            callback();
                        });
                    });
                });
            });

            async.parallel(asyncTasks, function () {
                res.json(teamProfiles)
            });
        });
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试进行嵌套查询时已调用节点异步回调

来自分类Dev

节点异步瀑布回调已被调用

来自分类Dev

节点异步瀑布回调已被调用

来自分类Dev

尝试使用C ++插件调用节点js回调时崩溃

来自分类Dev

正在调用节点异步回调以完成操作

来自分类Dev

嵌套异步循环推送到异步队列而不调用主回调

来自分类Dev

单元测试嵌套异步函数时异步回调超时

来自分类Dev

回调已称为异步并行

来自分类Dev

节点,异步编程,回调地狱

来自分类Dev

节点脚本等待异步回调

来自分类Dev

Javascript异步功能和嵌套的回调

来自分类Dev

NodeJS异步:已经调用了回调?

来自分类Dev

等待异步方法中的回调被调用

来自分类Dev

访问异步调用的回调参数

来自分类Dev

NodeJS异步:已经调用了回调?

来自分类Dev

多次异步调用后回调?

来自分类Dev

回调已在异步模块中调用

来自分类Dev

NodeJS 异步:回调已被调用?

来自分类Dev

异步 Ajax 调用混淆回调

来自分类Dev

在BeginReceive回调中进行异步/等待

来自分类Dev

超时内未调用异步回调-对Typescript和Angular $ http服务进行单元测试

来自分类Dev

多个查询的节点MySql回调

来自分类Dev

使用Promise进行递归意味着已注册的回调被多次调用

来自分类Dev

调用了异步回调,但有时不执行

来自分类Dev

在使用OkHttp调用多个异步请求时,有时会干扰回调

来自分类Dev

调用了异步回调,但有时不执行

来自分类Dev

无法设置回调时在Jasmine 2.0中进行异步测试

来自分类Dev

在本机节点的回调中调用回调

来自分类Dev

用户尝试退出时提示回调