#reactjs #promise
#reactjs #обещание
Вопрос:
У меня есть профиль, который делает это..
Promise.all([this.fetchInsights(), this.fetchTouchpoints()])
.then(([insights, touchpoints]) =>
console.log(insights, touchpoints)
)
Вот fetchInsights()
fetchInsights = () => {
fetch('API_URL' this.queryParams.custId '/' this.queryParams.acctNo, {
method: 'GET', // or 'PUT'
headers:{
'Content-Type': 'application/json',
'Accept': 'application/json'
}
}).then(res => res.json())
.catch(error => console.error('Error:', error));
};
Вот fetchTouchpoints()
fetchTouchpoints = () => {
fetch('API_URL' this.queryParams.custId '/' this.queryParams.acctNo, {
method: 'GET', // or 'PUT'
headers:{
'Content-Type': 'application/json',
'Accept': 'application/json'
}
}).then(res2 => res2.json())
.catch(error => console.error('Error:', error));
};
Когда я запускаю это, страница сразу читается как неопределенная, undefined. Это связано с тем, что insights и точки соприкосновения не определены, поскольку вызовы API не завершены.
Когда я смотрю на журнал в Eclipse (это приложение Springboot), я вижу, что ответ является успешным, и он выводит ответ в консоль там… но приложение не обновляется.
Как я могу сделать так, чтобы Promise.all печатал журнал ПОСЛЕ выполнения обоих вызовов API?
Я попытался вставить Promise.all
в componentDidMount
и в render()
Любая помощь была бы высоко оценена!!
Комментарии:
1. Ваши
fetchX
функции не выполняютreturn
обещания, которые они создают, поэтомуPromise.all
ничего не ждет.
Ответ №1:
Вы забыли вернуть обещания.
Кстати, для удобства чтения кода используйте строки шаблона
Вот исправленное fetchInsights
:
fetchInsights = () => {
return fetch(`API_URL${this.queryParams.custId}/${this.queryParams.acctNo}`, {
method: 'GET', // or 'PUT'
headers:{
'Content-Type': 'application/json',
'Accept': 'application/json'
}
}).then(res => res.json())
.catch(error => console.error('Error:', error));
};
Комментарии:
1. каков наилучший способ разделить ответы в Promise.all? вместо then ([1, 1]) как я могу выполнить первый ответ, а затем второй?
2. Если вы зависите от ответа первого, вы могли бы вызвать второй вместо
.then
первого. Или вы пишете асинхронную функцию и используетеawait fetch...