2017-01-13 39 views
0

我正在Express应用程序的端点中工作,并且它需要返回属于特定用户的一组Story记录。我正在使用与请求一起提交的JSON Web令牌来标识用户。从那里,我找到他们相关的项目(通过连接表,UserProjects)。然后,我正在循环每个项目以查找其相关故事。获取Sequelize Promises链的最终结果

最终,我需要一个故事数组作为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语法的时间间隔相同的效果?

+0

当您使用的承诺错了 - 你可以返回,并把它们连没有嵌套他们 - 建筑非常差。与其提出所有这些要求,是否有任何一个你只能做出其中的一个或两个?另外,问题出现在你使用不包含promise的'.map'的地方。 – Adam

+0

另外,'return stories.map(story)=> {return story})'完全没有成就。 – Adam

+2

您应该使用预先加载来获取一个查询中的所有数据,而不是执行一堆嵌套查询,如文档中所述:http://docs.sequelizejs.com/en/v3/docs/models-用法/#热切加载 –

回答

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) 
     }) 
    }) 
    }) 

一个大事情我做错了返航的非承诺和努力链将它们与then电话:

.then((projects) => { 
      return projects.map((project) => { 
      return project.getStories() 
      .then((stories) => {...