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?