node.js嵌套async.eachSeries

我刚刚进入节点,并结束了新的async.js。 我不确定我想做的事情是可行的(猜测是这样),还是我的做法是正确的(猜测不是)。 这是事情:

这个代码是pipe理一些instagram数据,所以我会根据代码实际需要做的事情来解释一切,以便更容易理解。

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

  2. 为每个ID我想获得拉斯维加斯10个职位(我已经保存在我的数据库中)。

  3. 对于每个帐户的10个项目,我需要获得(评论+喜欢)的总和,并将该值与第一个eachSeries调用的out代码相比较。

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

我只是没有设置callback每个eachSeries,因为我不知道把它们放在哪里,我认为我的代码更容易理解这种方式。

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

所以你主要在那里(至less有callback)。

如果您在https://github.com/caolan/async上查看async的文档,您会看到每个系列的调用也有一个callback,所以一旦系列完成,您可以执行一些操作。

看起来你的代码试图完成一旦内部系列完成添加所有的值计数。 所以你的async.eachSeries调用最终会看起来像这样(加上一些额外的error handling,我肯定会推荐你的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个项目,除非你已经保存在你的数据库中。