获得Sequelize Promises链的最终结果

时间:2017-01-13 22:54:27

标签: javascript asynchronous sequelize.js

我在Express应用中的端点工作,需要返回一组属于特定用户的Story记录。我使用随请求提交的JSON Web令牌来识别用户。从那里,我找到了他们的相关项目(通过连接表,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语法获得与间隔相同的效果?

2 个答案:

答案 0 :(得分:0)

在阅读了原始问题的评论并花了更多时间阅读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) => {...

答案 1 :(得分:0)

我在接收时遇到了类似的问题

from itertools import permutations

a=[[0,1,3],[4,2]]
a1=a[0]
a2=a[1]

a3=a1.copy()
a3.extend(a2)

perms=list(permutations(a3, 2))
print(perms)
new_arr = []

for i in perms:
    if (i[0] in a1 and i[1] in a1) or (i[0] in a2 and i[1] in a2):
        new_arr.append(1)
    else:
        new_arr.append(0)

print(new_arr)

使用 sequelize 创建实体之后。最终,我只是忘了{ "isFulfilled": false, "isRejected": false } await 调用。添加 repository.create<>(...data) 后,一切都如预期。