异步每个回调在迭代之前被调用

时间:2015-04-16 12:28:42

标签: javascript node.js asynchronous

我有以下路由功能:

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中我正在调试响应)。

那么我做错了什么?

2 个答案:

答案 0 :(得分:3)

您正在立即调用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);
});

答案 1 :(得分:0)

res.json(result)作为函数调用,因此立即调用。要确保在res.json之后调用async.each(),您需要将函数作为回调传递:

async.each(result, function () {
    ...
}, function(err) {
    if(!err) res.json(result);
));