Sequelize asincronously映射结果

时间:2014-02-27 22:48:29

标签: node.js sequelize.js

我正在开发一个带有角度前端和在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 a / p>

1 个答案:

答案 0 :(得分: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
})