setTimeout и axios Promise nest запросы

Сцена проблемы, с которой я столкнулся, заключается в том, что, когда я получаю ответы пользователя, я также хочу получить вопрос, связанный с каждым ответом, и, наконец, я получу теги, связанные с вопросом, как показано ниже:

function fetchUserQuestionTags(href, question) {
  axios.get(href).then(
    (success) => {
      let tags = []
      success.data._embedded.tags.map(tag => {
        tags.push(tag.name)
      })
      question.tags = tags
    }
  ).catch((error) => console.log(error.response))
}

export function fetchUserAnswers(username) {
  return dispatch => {
    // start get answers
    return axios.get('/api/users/' + username + '/answers').then(success => {
      let answers = success.data._embedded.answers
      return answers
    }).then(answers => {
      // map every answer to get associated question's data
      answers.map(answer => {
        axios.get(answer._links.question.href).then(success => {
          let question = success.data
          answer.questionId = question.id
          answer.questionTitle = question.title
          answer.solved = question.solved
          // get question's tags
          fetchUserQuestionTags(question._links.tags.href, question)
          // due to fetchUserQuestionTags is asynchronous
          // if not put below code in setTimeout block, 
          // the answer doesn't have tags data
          setTimeout(function () {
            answer.questionTags = question.tags
          }, 15)
        })
      })
      // the same as above, because async I put dispatch
      // in setTimeout block
      setTimeout(function () {
        dispatch(userAnswersReceive(answers))
      }, 300)
    })
      .catch(error => console.log(error.response))
  }
}

Я использую Spring boot + Spring data rest как бэкэнд, React + Redux + axios как фронт

Итак, проблема в том, что я не уверен, что это хороший способ использовать setTimeout в nest Promise(использовать клиентскую библиотеку HTTP Axios), если я хочу получать данные с сервера, но это происходит медленно, я думаю, что setTimeout я использую здесь не так.

Есть ли хорошее решение: не используйте setTimeout и не решайте проблему Promise?

UPD:

function fetchUserQuestionTags(href, question) {
   return axios.get(href).then(
   ...
}

export function fetchUserAnswers(username) {
  return dispatch => {
    // start get answers
    return axios.get('/api/users/' + username + 
    ...
    }).then(answers => {
      // map every answer to get associated question's data
      let answers1 = answers.map(answer => {
          ...
          fetchUserQuestionTags(question._links.tags.href, question).then(tags => {
        answer.questionTags = tags
        return answer
      })
      return answers1
      })
    }).then(answers => setTimeout(function () {
      dispatch(userAnswersReceive(answers))
    }, 150))
   ...

Наконец, я также должен использовать setTimeout, если я не использую его, я не могу получить все данные после рендеринга React (ответы, которые я помещаю в состояние Redux), есть ли лучшее решение, не использующее setTimeout?

0 ответов

Другие вопросы по тегам