Я делаю запросы API, используя изоморфную выборку, и используя Redux для управления состоянием моего приложения.Как обрабатывать ошибки в ответах fetch() с помощью Redux Thunk?
Я хочу обрабатывать ошибки потери интернет-соединения и ошибки 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))
})
}
}
Если я intionally отключить подключение к интернету, в JS консоли, когда я вхожу через console.log() (как описано выше), он этот вывод: 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(…)
Прости меня, если это совершенно неправильно, но я не Не хочу ничего делать, кроме как отключить два действия Redux при возникновении ошибки (общая ошибка и одна конкретная для действия мы повторное выполнение при возникновении ошибки).
Является ли то, что я пытаюсь достичь, даже возможно?
Кажется, что (через мой каротаж в консоль) «затем» часть сценария по-прежнему выполняется (как содержимое него мои функции отправки «ловить») ..
Ничего себе, спасибо за подробное вскрытие. Чтение введения Redux Thunk »прямо сейчас. Большое спасибо! –
@Dan Abramov Что делать, если я хочу извлечь выборку в отдельное место, вместе с «fetch полностью не удалось (например, cors или timeout timeout/отказался)» catch, но оставить более конкретный улов в действии. Является ли это возможным? –
@ Дана Абрамова - У меня возникают проблемы, связанные с обещанием в этом сценарии. он всегда запускает разрешенную функцию в цепочке вместо отклоненной, когда в thunk она определенно отклоняется с момента отправки моего действия с ошибкой. мысли? –