【问题标题】:node.js nested async.eachSeriesnode.js 嵌套 async.eachSeries
【发布时间】:2016-06-22 16:41:49
【问题描述】:

我刚接触 node 并结束新的 async.js。我不确定我正在尝试做的事情是否可行(猜猜是),或者我的做法是否正确(猜猜不是)。事情是这样的:

这段代码是用来管理一些instagram数据的,所以我会根据代码实际需要做什么来解释一切,以便更容易理解。

  1. 连接到 mongoDB,获取一些 Instagram 帐户 ID(完成)

  2. 对于每个 id,我想获取 las 10 个帖子(我已经将其保存在我的数据库中)。

  3. 对于每个帐户的 10 项,我需要获取 (cmets + likes) 的总和,并将该值添加到第一个 eachSeries 调用的输出代码中。

    router.get('/users_all', function(req, res) {   
    
        User.find().sort({'counts.followed_by': 'descending'}).exec(function(err, users) { 
    
            async.eachSeries(users, function(item, outerCallback) { 
    
                Media.find({'userId': item.user_id}).exec(function(err, medias) {       
    
                    var count = 0;
    
                    async.eachSeries(medias, function(item, outerCallback2) {               
    
                        count += item.comments_count + item.likes_count;            
                    });     
    
                });
    
                item.totalAmount = count;
    
            }); 
    
            res.json(users);
    
        });
    
    }
    

我只是没有设置每个系列的回调调用,因为我不知道将它们放在哪里,而且我认为我的代码这样更容易理解。

如果需要有关代码的更多说明,请询问。 感谢您的帮助。

【问题讨论】:

    标签: node.js mongodb callback nested async.js


    【解决方案1】:

    所以你大部分时间都在那里(至少有回调)。

    如果您查看https://github.com/caolan/async 的异步文档,您会看到对eachSeries 的调用也有回调,因此一旦系列完成,您就可以执行一些操作。

    看起来您的代码正在尝试在内部系列完成添加所有要计数的值后完成。所以你的 async.eachSeries 调用最终会看起来像这样(加上一些额外的错误处理,我肯定会推荐你的 mongo 查询)。

    router.get('/users_all', function(req, res) {
        User.find().sort({'counts.followed_by': 'descending'}).exec(function(err, users) {
            if (err) {
                res.status(500).json({code: 500, message: 'Internal server error'});
            } else {
                async.eachSeries(users, function (item, outerCallback) {
                    Media.find({'userId': item.user_id}).exec(function (err, medias) {
                        if (err) {
                            outerCallback(err);
                        } else {
                            var count = 0;
                            async.eachSeries(medias, function (item, innerCallback) {
                                count += item.comments_count + item.likes_count;
                                innerCallback();
                            }, function () {
                                if (err) {
                                    outerCallback(err);
                                } else {
                                    item.totalAmount = count;
                                    outerCallback();
                                }
                            });
                        }
                    });
                }, function () {
                    res.json(users);
                });
            }
        });
    });
    

    问题在于,您实际上并没有将自己限制在最近的 10 个项目中,除非这是您在数据库中保存的全部内容。

    【讨论】:

    • 你说得对,我将代码简化为不要将媒体模型的结果限制为 10,但我只是替换了代码中的 Media.find。它工作完美,感谢您的帮助。必须要求从中学习一些东西:您基本上使用回调“以某种方式”结束 eachSeries 循环的每次迭代并在添加到 eachSeries 方法的函数处获得结果?就这么简单吗?谢谢
    • 不是超级有经验,可能说的有点不对,但我的理解基本上不是返回结束函数说你已经完成了你的处理,你让 eachSeries 函数知道迭代已经完成通过那个回调。然后,一旦它们都完成,您定义自己的回调,一旦数组中的每个回调完成,就会调用该回调。所以是的!就这么简单!您还可以在回调中包含错误主体,并且 async 处理它们的方式略有不同。
    猜你喜欢
    • 2014-10-31
    • 2014-07-14
    • 2017-01-24
    • 2014-03-10
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多