Wykonuję żądania interfejsu API przy użyciu pobierania izomorficznego i używam Redux do obsługi stanu mojej aplikacji.Jak radzić sobie z błędami w odpowiedziach pobierania() z Redux Thunk?
Chcę obsłużyć zarówno błędy utraty połączenia internetowego, jak i błędy interfejsu API, uruchamiając akcje Redux.
Mam następujący (work-in-progress/złe) kodu, ale nie można dowiedzieć się w prawidłowy sposób, aby ogień działania Redux (zamiast po prostu wyrzucić błąd i zatrzymać wszystko):
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))
})
}
}
Gdybym intionally wyłączyć połączenie z internetem w konsoli JS, gdy loguję poprzez console.log() (jak wyżej), to na wyjściu to: 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(…)
Wybacz mi, jeśli to jest całkowicie błędne, ale don nie chcesz robić nic poza odpaleniem dwóch akcji Redux, gdy wystąpi błąd (błąd ogólny i jedno działanie, które my ponowne wykonanie po wystąpieniu błędu).
Czy to, co próbuję osiągnąć, jest możliwe?
Wydaje się, że (przez mój logowania do konsoli) do „następnie” część skryptu jest nadal wykonywany (jako zawartość tego są moje „połów” funkcje dyspozytorskie) ..
Wow, dzięki za szczegółowe rozbiórkę. Czytanie wstępu do Redux Thunk "teraz. Wielkie dzięki! –
@Dan Abramov co jeśli chcę wyodrębnić pobieranie w oddzielnym miejscu, wraz z "pobierz kompletnie nieudane (powiedzmy cors lub connectionoutout/odmówił)" catch, ale pozostaw bardziej specyficzny połów w akcji. Czy to możliwe? –
@ Dan Abramov - Mam problemy z łańcuchem od obietnicy w tym scenariuszu. zawsze uruchamia funkcję rozstrzygniętą w łańcuchu, zamiast odrzuconej, kiedy jest w odrzecieniu zdecydowanie odrzucona, ponieważ moja akcja błędu jest wysyłana. myśli? –