async 在迭代之前调用每个回调
async each callback is called before iteration
我有以下路由功能:
router.route('/api/teamUsersWithStat/:team_id')
.get(function (req, res) {
var user_stat = academy_team_user_stat.build();
user_stat.usersByTeam(req.params.team_id, function (result) {
if (result) {
async.each(result, function () {
var i = 0;
user_stat.findModulesTaken(res.user_id, res.team_id, function (modules) {
result[i].modules = modules;
i++;
});
}, res.json(result))
} else {
res.status(401).send("Team not found");
}
}, function (error) {
res.send("Team not found");
});
});
如您所见,我正在使用 async.each
方法向现有数组收集额外数据。
然而 res.json(result)
在没有它的情况下被调用 运行 实际循环。
(我可以在 javascript 中告诉我我正在调试响应)。
那我做错了什么?
res.json(result)
作为函数调用,因此会立即调用。要确保 res.json
在 async.each()
之后被调用,您需要传递一个函数作为回调:
async.each(result, function () {
...
}, function(err) {
if(!err) res.json(result);
));
您直接调用 res.json
方法,您还在循环内重新初始化 i
,因此它始终是 0
。
此外,each
需要回调才能进行下一次迭代。
以下是我的做法:
async.each(result, function (r, callback) {
user_stat.findModulesTaken(res.user_id, res.team_id, function (modules) {
result[result.indexOf(r)].modules = modules;
callback();
});
}, function(err) {
if(err)
return res.json(err);
res.json(result);
});
我有以下路由功能:
router.route('/api/teamUsersWithStat/:team_id')
.get(function (req, res) {
var user_stat = academy_team_user_stat.build();
user_stat.usersByTeam(req.params.team_id, function (result) {
if (result) {
async.each(result, function () {
var i = 0;
user_stat.findModulesTaken(res.user_id, res.team_id, function (modules) {
result[i].modules = modules;
i++;
});
}, res.json(result))
} else {
res.status(401).send("Team not found");
}
}, function (error) {
res.send("Team not found");
});
});
如您所见,我正在使用 async.each
方法向现有数组收集额外数据。
然而 res.json(result)
在没有它的情况下被调用 运行 实际循环。
(我可以在 javascript 中告诉我我正在调试响应)。
那我做错了什么?
res.json(result)
作为函数调用,因此会立即调用。要确保 res.json
在 async.each()
之后被调用,您需要传递一个函数作为回调:
async.each(result, function () {
...
}, function(err) {
if(!err) res.json(result);
));
您直接调用 res.json
方法,您还在循环内重新初始化 i
,因此它始终是 0
。
此外,each
需要回调才能进行下一次迭代。
以下是我的做法:
async.each(result, function (r, callback) {
user_stat.findModulesTaken(res.user_id, res.team_id, function (modules) {
result[result.indexOf(r)].modules = modules;
callback();
});
}, function(err) {
if(err)
return res.json(err);
res.json(result);
});