我正在 Express 应用程序的端点中工作,它需要返回一组属于特定用户的 Story 记录。我正在使用随请求提交的 JSON Web token 来识别用户。从那里,我找到了他们关联的项目(通过连接表 UserProjects)。然后我会遍历每个项目以找到其关联的故事。
最终,我需要一系列故事以 JSON 形式返回给用户。
router.route('/')
.get((request, response) => {
let token = request.headers['reax-tracker-access-token'];
jwt.verify(token, 'secret', (err, decoded) => {
User.find({ where: { id: decoded.user } })
.then( (user) => {
return user.getProjects()
.then( (projects) => {
return projects.map( (project) => {
return project.getStories()
.then( (stories) => {
return stories.map( (story) => {
return story
})
})
})
})
})
.then((stories) => {
response.json(stories)
})
})
})
router.route('/:stories');
返回:
[
{
"isFulfilled": false,
"isRejected": false
},
{
"isFulfilled": false,
"isRejected": false
},
{
"isFulfilled": false,
"isRejected": false
}
]
这对我来说很有意义,因为如果我使用
setInterval
在最终的 then
中等待,我会得到我期望的结果。.then((stories) => {
return setInterval(function() {
response.json(stories)
}, 2000)
})
如何使用适当的 Promise 语法实现与间隔相同的效果?
最佳答案
在阅读了对原始问题的评论并在 Sequelize 文档上花费了更多时间后,我找到了解决我遇到的问题的方法。这个版本避免了@Adam 指出的一些嵌套,它利用了 Sequelize @Jordan 指出的急切加载功能。我相信它仍然可以改进,我很乐意就如何这样做提供任何意见。
router.route('/')
.get((request, response) => {
let token = request.headers['reax-tracker-access-token'];
jwt.verify(token, 'secret', (err, decoded) => {
User.find(
{
where: { id: decoded.user}
}
)
.then( (user) => {
return UserProject.findAll(
{
where: {
userId: user.id
}
})
})
.then((userProjects) => {
let projectIds = userProjects.map((up) => {
return up.dataValues.projectId
})
return Story.findAll({
where: {
projectId: projectIds
}
})
})
.then((stories) => {
response.status(200).json(stories)
})
})
})
我做错的一件大事是返回非 promise 并尝试使用
then
调用链接它们:.then( (projects) => {
return projects.map( (project) => {
return project.getStories()
.then( (stories) => {...
关于javascript - 获取一系列 Sequelize Promise 的最终结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41644709/