私はisomorphic fetchを使ってAPIリクエストを行い、Reduxを使ってアプリケーションの状態を処理しています。Redux Thunkでfetch()応答のエラーを処理する方法は?
インターネット接続の切断エラーとAPIエラーの両方を、Reduxのアクションを実行して処理したいと考えています。
私は、次の(作業中の/悪い)コードを持っていますが、(単にすべてをエラーをスローし、停止ではなく)Reduxのアクションを発射するための正しい方法を見つけ出すことはできません。
export function createPost(data = {}) {
return dispatch => {
dispatch(requestCreatePost(data))
return fetch(API_URL + data.type, {
credentials: 'same-origin',
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-WP-Nonce': API.nonce
},
body: JSON.stringify(Object.assign({}, data, {status: 'publish'}))
}).catch((err) => {
//HANDLE WHEN HTTP ISN'T EVEN WORKING
return dispatch => Promise.all([
dispatch({type: PRE_FETCH_RESOURCES_FAIL, errorType: 'fatal', message:'Error fetching resources', id: h.uniqueId()}),
dispatch({type: PRE_CREATE_API_ENTITY_ERROR, errorType: 'fatal', id: h.uniqueId(), message: 'Entity error before creating'})
])
}).then((req) => {
//HANDLE RESPONSES THAT CONSTITUTE AN ERROR (VIA THEIR HTTP STATUS CODE)
console.log(req);
if (!req || req.status >= 400) {
return dispatch => Promise.all([
dispatch({type: FETCH_RESOURCES_FAIL, errorType: 'warning', message:'Error after fetching resources', id: h.uniqueId()}),
dispatch({type: CREATE_API_ENTITY_ERROR, errorType: 'warning', id: h.uniqueId(), message: 'Entity error whilst creating'})
])
}
else {
return req.json()
}
}).then((json) => {
var returnData = Object.assign({},json,{
type: data.type
});
dispatch(receiveCreatePost(returnData))
})
}
}
を
私は経由にconsole.log(ログインしたときに、私はintionally(上記のように))、JSコンソールで、インターネット接続を無効にした場合、それはこれを出力しています: POST http://example.com/post net::ERR_INTERNET_DISCONNECTED(anonymous function) (dispatch) { return Promise.all([dispatch({ type: PRE_FETCH_RESOURCES_FAIL, errorType: 'fatal', message: 'Error fetching resources', id: _CBUtils2.default.uniqueId() }), dispatch({ type:… cb_app_scripts.js?ver=1.0.0:27976 Uncaught (in promise) TypeError: req.json is not a function(…)
これは完全に間違っている場合は、私を許し、私ドンエラーが発生した場合は2つのReduxアクションを実行します(一般的なエラーです。エラーが発生したときに再実行)。
達成しようとしていることはありますか?
(私のログを経由してコンソールへの)スクリプトの「を」の部分がまだ実行されている(これの内容は私の「キャッチ」ディスパッチ機能であるとして)。..
うわー、詳しい解剖に感謝します。今すぐRedux Thunkのイントロを読んでください。どうもありがとう! –
@ダン・アブラモフどのような場合に、「フェッチが完全に失敗した(corsまたは接続のタイムアウト/拒否)」キャッチといっしょに別の場所にフェッチを抽出したいのですが、そのアクションに特定のキャッチを残してください。出来ますか? –
@ダン・アブラモフ - 私はこのシナリオで約束を守る問題を抱えています。拒否された関数の代わりにチェーン内の解決された関数を常に起動しています。私のエラーアクションがディスパッチされてから間違いなく拒否されたときです。思考? –