2015-04-16 98 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); 
));