node.js 嵌套 async.eachSeries
node.js nested async.eachSeries
我是 node 的新手,即将成为 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 设置回调调用,因为我不知道将它们放在哪里,而且我认为我的代码更容易理解这种方式。
如果需要更多关于代码的说明,请询问。
感谢您的帮助。
所以你大部分时间都在那里(至少在回调中)。
如果您在 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 个项目中,除非您在数据库中保存的就是这些。
我是 node 的新手,即将成为 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 设置回调调用,因为我不知道将它们放在哪里,而且我认为我的代码更容易理解这种方式。
如果需要更多关于代码的说明,请询问。 感谢您的帮助。
所以你大部分时间都在那里(至少在回调中)。
如果您在 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 个项目中,除非您在数据库中保存的就是这些。