我正在尝试使用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 :(得分:3)
您需要在async.map
的完成回调中运行onSuccess
。第一个回调是迭代器,为每个映射元素运行;所有迭代完成后,第二个回调(您当前不会使用)运行。
async.map(modules, function (module,moduleCallback) {
//...
}, function(err, modules) {
onSuccess(modules);
});
目前,您的代码将异步map
作业排队,然后运行onSuccess
,而无需等待map
完成(甚至启动)。