/ / Възможно необработено отхвърляне на обещание, докато е налице улов - javascript, реагиращ род, редукс, обещание

Възможно отхвърляне на обещания, докато не е налице улов - javascript, реакция-нативна, редук, обещание

Имам следния код:

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

Ти трябва

  1. връщане response.json() в първия. then манипулатор: .then(response => response.ok && response.json())
  2. Добавете по-сигурна проверка във втория. Then handler like if (json && json.data)
  3. изпратете действието за неуспех, вместо да хвърляте грешка, ако няма 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))
)
}
}

Не забравяйте, че функциите на стрелките имплицитно връщат стойността на израза, когато използвате синтаксиса на краткото тяло, т.е.без скоби за блокове.