Node.js 对映射结果进行后续处理

Node.js 对映射结果进行后续处理,node.js,sequelize.js,Node.js,Sequelize.js,我正在开发一个包含angular前端和在nodejs中开发的restfull后端的项目。 此项目使用现有的MySQL数据库。我使用sequelizejs orm将节点与mysql连接起来 在数据库中有两个实体:用户和项目。一个项目有许多用户(称为工作者) Sequelize很好用。它返回所有项目,getWorkers返回此项目的正确用户 有什么问题? 问题是不规则调用,在发送响应后调用getWorkers。这是不正确的。在发送结果之前,我需要在每个项目中添加工人。 console.log说:b(

我正在开发一个包含angular前端和在nodejs中开发的restfull后端的项目。 此项目使用现有的MySQL数据库。我使用sequelizejs orm将节点与mysql连接起来

在数据库中有两个实体:用户和项目。一个项目有许多用户(称为工作者)

Sequelize很好用。它返回所有项目,getWorkers返回此项目的正确用户

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

您在这里有两个选项:您可以稍微修改现有代码,使其仅在所有getWorkers调用成功后返回,或者您可以使用即时加载一次性获取项目和工作人员:

选择1
\uu.done
创建一个函数,该函数在被调用projects.length次后调用res.json。如果您的项目中还没有下划线/lodash,则可以使用
Sequelize.Utils.\uAfter

选择2
Wooow终于!!选项2有效!!通过表格用户项目进行多对多。非常感谢Jan。两种解决方案都很有趣。
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);
     });
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);
    });
});
Project.findAll({
    include: [
        { model: User, as: 'Workers' }
   ]
}).success(function (projects) {
    // project.workers is already populated here
})