Fetch: отклонить обещание и уловить ошибку, если статус не в порядке?
Вот что я собираюсь:
import 'whatwg-fetch';
function fetchVehicle(id) {
return dispatch => {
return dispatch({
type: 'FETCH_VEHICLE',
payload: fetch('http://swapi.co/api/vehicles/${id}/')
.then(status)
.then(res => res.json())
.catch(error => {
throw(error);
})
});
};
}
function status(res) {
if (!res.ok) {
return Promise.reject()
}
return res;
}
EDIT: обещание не отвергается, что я пытаюсь выяснить.
Я использую этот полигон заполнения в Redux с программным обеспечением redux-prom -middleware.
Ответы
Ответ 1
Посылы Fetch только отклоняются с помощью TypeError при возникновении сетевой ошибки. Поскольку ответы 4xx и 5xx не являются сетевыми ошибками, их нечего ловить. Вам нужно будет самостоятельно указать ошибку для использования Promise#catch
.
Функция Fetch Response удобно снабжает ok
, которая сообщает вам, удалось ли выполнить запрос. Что-то вроде этого должно сделать трюк:
fetch(url).then((response) => {
if (response.ok) {
return response.json();
} else {
throw new Error('Something went wrong');
}
})
.then((responseJson) => {
// Do something with the response
})
.catch((error) => {
console.log(error)
});
Ответ 2
Спасибо за помощь всем, отказавшись от обещания в .catch()
решили мою проблему:
export function fetchVehicle(id) {
return dispatch => {
return dispatch({
type: 'FETCH_VEHICLE',
payload: fetch('http://swapi.co/api/vehicles/${id}/')
.then(status)
.then(res => res.json())
.catch(error => {
return Promise.reject()
})
});
};
}
function status(res) {
if (!res.ok) {
throw new Error(res.statusText);
}
return res;
}
Ответ 3
Я просто проверил состояние объекта ответа:
$promise.then( function successCallback(response) {
console.log(response);
if( response.status === 200 ) { ... }
});