我正在尝试使用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。
所以我的问题是,我做错了什么,怎样才能解决它?
发布于 2015-06-12 12:01:33
您需要在对onSuccess的完成回调中运行async.map。第一个回调是迭代器,为每个映射的元素运行;第二个回调(您目前没有使用)在所有迭代完成后运行。
async.map(modules, function (module,moduleCallback) {
//...
}, function(err, modules) {
onSuccess(modules);
});目前,您的代码将异步map作业排成队列,然后运行onSuccess,而无需等待map完成(甚至启动)。
https://stackoverflow.com/questions/30802311
复制相似问题