1. ホーム
  2. javascript

[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?

2022-07-16 11:27:24

質問

こんな感じです。

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-promise-ミドルウェア .

どのように解決するのですか?

フェッチ プロミスはネットワークエラーが発生したときだけTypeErrorで拒否します。4xxと5xxのレスポンスはネットワークエラーではないので、キャッチするものは何もありません。を使うには自分でエラーを投げる必要があります。 Promise#catch .

A レスポンス取得 は、都合よく 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)
});