Имам следния код:
export function fetchValueFromApi(){
return function act(dispatch){
dispatch(fetchingLimit);
return fetch("https://someapi/v1/foo/bar?api_key=123456789")
.then(response =>{
console.log("response",response.json());
response.json();
}).then(json =>{
if (json.data()) {
dispatch(receivingValue(json.data.result))
} else {
throw new Error("Error");
}
}).catch(error => dispatch(receivingValueFailed(error)))
}
}
Сега знам, че това обаждане няма да успее. Очаквам да се провали и да вляза в уловката. Получавам обаче тази грешка:
Възможно необработено отхвърляне на обещание
Така че по някаква причина ние не удряме .catch
.
Как мога да разреша това?
Отговори:
2 за отговор № 1Така че удряте улова, само не с грешката, която очаквахте.
Що се отнася до извличането, 403 не е грешказасегната, тъй като самата заявка е направена успешно (отговорът просто не е такъв, какъвто е очаквал вашето приложение). Трябва да се справите сами с грешки от 40Х. И както разкрива вашият console.log, изключението се случва преди вашето throw new Error
е достигната.
Обещанието за извличане () ще отхвърли с TypeErrorкогато мрежова грешка е или CORS е неправилно конфигуриран от страна на сървъра, въпреки че това обикновено означава проблеми с разрешението или подобни - 404 не представлява например мрежова грешка.
от https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Ти трябва
- връщане
response.json()
в първия. then манипулатор:.then(response => response.ok && response.json())
- Добавете по-сигурна проверка във втория. Then handler like
if (json && json.data)
- изпратете действието за неуспех, вместо да хвърляте грешка, ако няма json данни
2 за отговор № 2
Ти не си return
даване на обещанията от вашия then
манипулатори, така че няма вериги. Тялото за отговор дори не се очаква. The catch
handler не е обвързан с обещанието, което всъщност отхвърля, поради което грешката наистина е необработена.
export function fetchValueFromApi(){
return function act(dispatch){
dispatch(fetchingLimit);
return fetch("https://someapi/v1/foo/bar?api_key=123456789")
.then(response => {
var body = response.json();
console.log("response body", body);
return body;
// ^^^^^^
}).then(json => {
if (json.data ) {
// ^
return dispatch(receivingValue(json.data.result))
// ^^^^^^
} else {
throw new Error("Error");
}
}).catch(error =>
dispatch(receivingValueFailed(error))
)
}
}
Не забравяйте, че функциите на стрелките имплицитно връщат стойността на израза, когато използвате синтаксиса на краткото тяло, т.е.без скоби за блокове.