javascript - sincronas - Fetch: rechazar la promesa y detectar el error si el estado no es correcto?
promise typescript (3)
Acabo de verificar el estado del objeto de respuesta:
$promise.then( function successCallback(response) {
console.log(response);
if( response.status === 200 ) { ... }
});
Esto es lo que tengo que hacer:
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;
}
EDITAR: La promesa no es rechazada, eso es lo que estoy tratando de averiguar.
Estoy usando este polyfill de recuperación en Redux con redux-promise-middleware .
Gracias por la ayuda a todos, rechazar la promesa en .catch()
resolvió mi problema:
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;
}
Fetch promete solo rechazar con un TypeError cuando se produce un error de red. Dado que las respuestas 4xx y 5xx no son errores de red, no hay nada que detectar. Tendrá que lanzar un error para usar Promise#catch
.
Una respuesta de búsqueda proporciona de forma conveniente una ok
, que le indica si la solicitud se realizó ok
. Algo como esto debería hacer el truco:
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)
});