获取:拒绝承诺并在状态不正常时捕获错误?

2022-08-30 02:38:21

以下是我要去的地方:

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;
}

编辑:承诺不会被拒绝,这就是我试图弄清楚的。

我正在 Redux 中使用这个 fetch polyfillredux-promise-middleware


答案 1

获取承诺仅在发生网络错误时使用 TypeError 拒绝。由于 4xx 和 5xx 响应不是网络错误,因此无需捕获任何内容。您需要自己抛出一个错误才能使用 。Promise#catch

获取响应方便地提供 ok ,它会告诉您请求是否成功。像这样的东西应该可以解决问题:

fetch(url).then((response) => {
  if (response.ok) {
    return response.json();
  }
  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;
}