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 ) { ... }

});