2015-04-16 94 views
0

叫我有以下路由功能:异步每个回调之前迭代

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方法来收集更多数据,以我现有的阵列看到的IM。

res.json(result)被调用,没有它运行实际的循环。

(我可以告诉这在我的JavaScript我正在调试响应)。

那么我做错了什么?

回答

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); 
}); 
0

res.json(result)被称为函数,因此立即调用。为了确保res.jsonasync.each()后调用,你需要通过一个函数作为回调:

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