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