2017-01-13 105 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) => {...