节点异步未运行异步

时间:2015-06-12 11:47:31

标签: javascript node.js asynchronous

我正在尝试使用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

所以我的问题是我做错了什么以及如何解决它?

1 个答案:

答案 0 :(得分:3)

您需要在async.map的完成回调中运行onSuccess。第一个回调是迭代器,为每个映射元素运行;所有迭代完成后,第二个回调(您当前不会使用)运行。

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

目前,您的代码将异步map作业排队,然后运行onSuccess,而无需等待map完成(甚至启动)。