node.js嵌套async.eachSeries

时间:2016-03-08 16:14:39

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

我刚刚进入节点并将新的结尾转换为async.js。我不确定我尝试做的事情是否可行(猜测是)或者我的做法是否正确(猜测不是)。事情就是这样:

此代码用于管理一些Instagram数据,因此我将根据代码实际需要做的事情来解释所有内容,以便更容易理解。

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

  2. 我希望获得每个ID的las 10个帖子(我已经保存在我的数据库中)。

  3. 对于每个帐户的10个项目,我需要得到(评论+喜欢)的总和,并将该值转换为第一个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);
    
        });
    
    }
    
  4. 我没有设置每个eachSeries的回调调用,因为我不知道放在哪里,我认为我的代码更容易理解。

    如果需要更多关于代码请求的澄清问题。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

看起来你的代码试图完成内部系列完成后添加所有值来计算。所以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个项目。