我目前正在使用带有Sequelize(MySQL)的Node.js,并且有两个模型在它们之间有关联:M.belongsTo(C)
。我要做的是查询所有C并将属于C的所有M添加到返回的JSON对象。请参阅下面代表我最新尝试的代码:
C.findAll({
where: {
parent_ids: ids
}
}).then(cs => {
let fCs = [];
for (let j = 0; j < cs.length; j++) {
let c = cs[j].get({ plain: true });
M.findAll({
where: {
CId: c._id
}
}).then(ms => {
let cMs = [];
for (let k = 0; k < ms.length; k++) {
cMs.push(ms[k].get({ plain: true }));
}
c.ms = cMs;
});
fCs.push(c);
}
return res.json({
success: true,
cs: fCs
});
}).catch(error => {
return res.json({
success: false
});
});
问题是M
模型上的内部查询是异步查询,我在执行任何查询之前得到响应。我也尝试使用Promise.all()
,但我无法使其正常工作,因为我正在外部C
查询中进行迭代。
如何让它按预期工作?
答案 0 :(得分:3)
由于数据库查询是异步操作,因此循环完成时不会执行任何查询,因此为了防止此推送,所有对数组的findAll调用和Promise.all(arrayOfPromises)将在所有findAll承诺成功解析后解析这些承诺。
var fCs = [], cs,
C.findAll({
where: {
parent_ids: ids
}
}).then(data => {
cs = data;
var promises = [];
for (let j = 0; j < cs.length; j++) {
let c = cs[j].get({ plain: true });
promises.push(M.findAll({
where: {
CId: c._id
}
}).then(ms => {
let cMs = [];
for (let k = 0; k < ms.length; k++) {
cMs.push(ms[k].get({ plain: true }));
}
return cMs;
}));
}
return Promise.all(promises)
}).then(result => {
fcs = cs.map((el, index) => {
let obj = el.get({plain: true})
obj.ms = result[index]
return obj
})
return res.json({
success: true,
cs: fCs
});
}).catch(error => {
return res.json({
success: false
});
});