我正在开发一个带有角度前端和在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>
答案 0 :(得分:1)
这里有两个选项:您可以稍微修改现有代码,只有在所有getWorkers调用成功后才返回,或者您可以使用预先加载来一次性获取项目和工作程序:
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
。
Project.findAll({
include: [
{ model: User, as: 'Workers' }
]
}).success(function (projects) {
// project.workers is already populated here
})