Sto facendo richieste API usando il recupero isomorfo e usando Redux per gestire lo stato della mia app.Come gestire gli errori nelle risposte fetch() con Redux Thunk?
Desidero gestire entrambi gli errori di perdita della connessione a Internet e gli errori API, disattivando le azioni di Redux.
Ho il seguente codice (work-in-progress/cattivo), ma non riesco a capire il modo corretto per sparare le azioni Redux (e non solo genera un errore e interrompere tutto):
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))
})
}
}
Se intionally disabilitare la connessione Internet, nella console JS, quando accedo tramite console.log() (come sopra), è l'output di questo: 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(…)
perdonatemi se questo è del tutto sbagliato, ma io don Non voglio fare altro che sparare due Azioni Redux quando c'è un errore (un errore generale e uno specifico per l'azione ri esibire quando si è verificato l'errore).
È quello che sto cercando di raggiungere anche possibile?
Sembra che (tramite il mio registrazione per consolle) il 'poi' è ancora in corso di esecuzione parte dello script (come il contenuto di esso sono le mie funzioni di invio 'catturare') ..
Wow, grazie per la dissezione dettagliata. Leggendo la Redux Thunk intro 'adesso. Molte grazie! –
@Dan Abramov Cosa succede se voglio estrarre il recupero in un posto separato, insieme al fermo "fetch completamente fallito (ad esempio cors o connection timeout/refused)", ma lasciare la cattura più specifica nell'azione. È possibile? –
@Dan Abramov - Sto riscontrando problemi nel mantenere una promessa in questo scenario. attiva sempre la funzione risolta nella catena anziché quella rifiutata, quando nel thunk viene definitivamente rifiutata dal momento in cui viene inviata la mia azione di errore. pensieri? Aggiornamento –