javascript - 获取一系列 Sequelize Promise 的最终结果

标签 javascript asynchronous sequelize.js

我正在 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/

相关文章:

javascript - 使用原始 Javascript 创建 Lucky 7 的游戏,我做错了什么?

javascript - 顺序异步等待调用未正确调用

node.js - 使用 Sequelize 与 Node 和 Express 批量插入

javascript - 如何使用sequelize获取表的所有数据

javascript - 在 Sequelize Hooks 中使用 Promise

javascript - 如何改变两张图片之间的动画速度? [像素相机jquery插件]

javascript - 事件处理程序上的匿名函数未激活样式

javascript - 单击时按钮不会消失(JavaScript)

java - Java 中 Thrift 的异步请求

javascript - 请求 Javascript/Angular 遇到异步问题