我的模型intent
与hasMany
以及conditions
和links
有nodes
关联。 nodes
本身也与links
有关联。
通过快速路线,我想在一个对象中获取所有信息。我现在这样做的方式是非常回调并且不可读。它有效,但我希望有更好的方法来写这些东西。
app.get('/api/intents/:id', function(req, res) {
models.intent.findOne({
where: {
id: req.params.id
}
})
.then(function(intent) {
intent.getConditions() // call generated function from intent model for conditions
.then(function(conditions) {
intent.getLinks() // then call generated function from intent model for links
.then(function(links) {
intent.getNodes() // then call generated function from nodes model for links
.then(function(nodes) {
Promise.map(nodes, function(node) {
return node.getLinks() // Even deeper nested and getting out of hand
.then(function(links) {
node.setDataValue('links', links)
})
})
.then(function() {
intent.setDataValue('conditions', conditions)
intent.setDataValue('links', links)
intent.setDataValue('nodes', nodes)
res.json(intent)
})
})
})
})
})
})
答案 0 :(得分:2)
我认为你完全错过了include
options
方法对象findOne
的概念。只需使用
models.intent.findById(req.params.id, {
include: [
{ model: models.condition },
{ model: models.link },
{ model: models.node, include: [ { model: models.link } ]
]
}).then((intent) => {
// here you get intent with conditions, links and nodes with links
});
其他方法是在模型上定义和使用scopes
。
答案 1 :(得分:0)
您可以使用Promise.all()
等待所有承诺得到解决,然后对数据执行某些操作。
以下是让您走上正轨的部分示例:
app.get('/api/intents/:id', function(req, res) {
models.intent.findOne({
where: {
id: req.params.id
}
})
.then(function(intent) {
let promises = []
promises.push(intent.getConditions())
promises.push(intent.getLinks())
promises.push(intent.getNodes())
Promise.all(promises)
.then(function(resolvedPromises) {
Promise.map(resolvedPromises, function(node) {
intent.setDataValue('conditions', resolvedPromises[0])
intent.setDataValue('links', resolvedPromises[1])
...
})
})
})