我刚刚进入节点并将新的结尾转换为async.js。我不确定我尝试做的事情是否可行(猜测是)或者我的做法是否正确(猜测不是)。事情就是这样:
此代码用于管理一些Instagram数据,因此我将根据代码实际需要做的事情来解释所有内容,以便更容易理解。
连接到mongoDB,获取一些Instagram帐户ID(已完成)
我希望获得每个ID的las 10个帖子(我已经保存在我的数据库中)。
对于每个帐户的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);
});
}
我没有设置每个eachSeries的回调调用,因为我不知道放在哪里,我认为我的代码更容易理解。
如果需要更多关于代码请求的澄清问题。 谢谢你的帮助。
答案 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个项目。