首页 文章

Sequelize asincronously映射结果

提问于
浏览
0

我正在开发一个带有角度前端的项目和一个在nodejs中开发的restfull后端 . 该项目使用现有的MySQL数据库 . 我使用sequelizejs orm来连接节点和mysql .

在数据库中有2个实体:用户和项目 . 一个项目有很多用户(命名为 Worker )

Project.findAll().success(function(projects) {

     var array=[];
     projects.forEach(function(project) {

         project.getWorkers().success(function(users) {
              project.workers=users;
              console.log('a');
         });
         console.log('b');
         array.push(project);

     });

     console.log('c');
         res.json(array);
     });

Sequelize工作正常 . 它返回所有项目,getWorkers返回此项目的正确用户 .

问题是什么?问题是异步调用,getWorkers在发出响应后被调用 . 这是不正确的 . 我需要在结果发送之前在每个项目中添加worker . console.log说:b b b c a a a a a a a a a(“c”是在“a”getWorkers之前调用的json响应 . 正确的方法是:b a a a b a a a a a b a c

1 回答

  • 1

    这里有两个选项:您可以稍微修改现有代码,只有在所有getWorkers调用成功后才返回,或者您可以使用预先加载来一次性获取项目和工作:

    选项1

    Project.findAll().success(function(projects) {
    
        var array =[],
            done = _.after(projects.length, function () {
                res.json(array);
            });
    
        projects.forEach(function (project) {
             project.getWorkers().success(function(users) {
                  project.workers = users;
                  done();
             });
             array.push(project);
        });
    });
    

    _.done 创建一个在调用projects.length次之后调用res.json的函数 . 如果您的项目中还没有下划线/ lodash,则可以使用 Sequelize.Utils._.after .

    选项2

    Project.findAll({
        include: [
            { model: User, as: 'Workers' }
       ]
    }).success(function (projects) {
        // project.workers is already populated here
    })
    

相关问题