2015-06-12 148 views
1

我正在嘗試使用async來向我的陣列收集一些附加數據。節點異步未運行異步

爲此,香港專業教育學院創建了以下:

User_has_academy_module.findAll({ 
    include: [{model: Module, include: [Category, ModuleType]}], 
    where: {academy_team_id: team_id, user_id: user_id} 
}).then(function (modules) { 
    var i = 0; 
    async.map(modules, function (module,moduleCallback) { 
     var act = Academy_Attempt.build(); 
     if(module.dataValues.is_complete == 1){ 
      act.findByUserTeamAndModule(module.dataValues.user_id, module.dataValues.academy_team_id, module.dataValues.module_id, function (result) { 
       module.dataValues.academy_attempt = result; 
       moduleCallback(null, module); 

      }, function (error) { 

      }) 
     } 
    }); 
    onSuccess(modules); 
}) 

,你可以從上面看到我首先收集的陣列稱爲modules,我需要遍歷每個這些modules我想找到,如果產生額外的數據值稱爲is_complete == 1

一旦它找到一個值就應該設置module.dataValues.academy_attempt = result

一旦所有的模塊已經迭代應該調用回調( onSuccess)並返回模塊。

但是它在異步調用之前運行onSuccess

所以我的問題是我做錯了什麼,如何解決它?

+0

只需在'async.map'回調中調用'onSuccess(modules)'函數即可。 –

回答

3

您需要在完成回調中運行onSuccessasync.map。第一個回調是迭代器,針對每個映射元素運行;第二個回調(當前不使用)在所有迭代完成後運行。

async.map(modules, function (module,moduleCallback) { 
    //... 
}, function(err, modules) { 
    onSuccess(modules); 
}); 

目前,你的代碼排隊異步map作業,然後運行onSuccess無需等待map完成(甚至開始)。