Получить окончательный результат цепочки секвенировать обещания

Я работаю в конечной точке в приложении Express, и она должна возвращать группу записей истории, принадлежащих конкретному пользователю. Я использую веб-маркер JSON, отправленный с запросом для идентификации пользователя. Оттуда я нахожу связанные с ними проекты (через Объединенную таблицу, 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?

1 ответ

  1. Прочитав комментарии к исходному вопросу и потратив еще немного времени на расшифровку документов, я нашел решение проблемы, с которой столкнулся. Эта версия позволяет избежать некоторых вложенности @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) => {...