redux-thunk und die Handhabung von Ausnahmen innerhalb dispatch Ergebnisse
Habe ich eine grundlegende thunk action creator und reducer adaptiert von der Redux-Dokumentation: http://redux.js.org/docs/advanced/AsyncActions.html
//action creator
function fetchPosts () {
return dispatch => {
dispatch({ type: 'FETCH_POSTS_REQUEST' })
return fetch('http://jsonplaceholder.typicode.com/posts')
.then(response => response.json())
.then(json => dispatch({ type: 'FETCH_POSTS_SUCCESS', items: json }))
//THIS CATCHES FETCH REQUEST ERRORS, AND COMPONENT LEVEL ERRORS
.catch(error => dispatch({ type: 'FETCH_POSTS_FAILURE', error: error.message }))
}
}
//reducer
function reducer (state = { isFetching: false, items: [] }, action) {
switch (action.type) {
case 'FETCH_POSTS_REQUEST':
return Object.assign({}, state, { isFetching: true })
case 'FETCH_POSTS_SUCCESS':
return Object.assign({}, state, { isFetching: false, items: action.items })
case 'FETCH_POSTS_FAILURE':
return Object.assign({}, state, { isFetching: false })
default:
return state
}
}
In einem React-Komponente übergeben wird, der Staat als Requisiten, die ich überprüfen Sie das Vorhandensein von post-Elemente, und wenn vorhanden die Kraft eine Komponente-level-Fehler:
const Test = props => {
if (!props.items.length) return null
throw new Error('Error!')
}
Beim starten der app:
fetchPosts
action Schöpfer genannt wird- Ein HTTP-request gemacht wird, und nach der Antwort eine FETCH_POSTS_SUCCESS Aktion ausgelöst wird.
- Die Komponente wird jetzt aktualisiert, mit den daraus resultierenden Elemente in den Staat und versucht zu Lesen
props.invalidProperty.error
- Dies bewirkt, dass eine JS-exception:
Cannot read property 'error' of undefined
So weit So gut.
Das Problem ist, dass die JS Ausnahme von der Komponente ist nie die Ausgabe in der Konsole. Stattdessen werden die catch()
block für die fetch-Versprechen fängt den Fehler und löst ein FETCH_POSTS_FAILURE Aktion.
Dies hat den Effekt, schlucken alle Fehler in Komponenten, die betroffen waren, durch die Aktualisierung der store. Ein FETCH_POSTS_FAILURE Zustandswechsel ausgelöst wird, aber das fühlt sich falsch - es war kein Fehler tatsächlich abrufen der Beiträge, aber ein Fehler downstream in einer Komponente über die stellen.
Ich bin auf der Suche nach einem Muster, zu helfen, separates Fehler in der asynchronen Anfrage von jeder anderen zufälligen Fehler, der Auftritt, als Folge der Veränderung des Staates, über die Versendung.
EDIT:
Beispiel mit dem async Beispiel in der Redux github repo: https://github.com/nandastone/redux/commit/88ab48040ce41c39d8daba8cc0c13a6f32c38adf#diff-eeb827d44ad03655e63b7e9319a03dd4R6
- Durch die "Netzwerk-request" - Fehler, beziehen Sie sich auf eine API-level-Fehler, eine nicht-2xx-Antwort?
- In der fetch-Beispiel, wäre es eine API-level-Fehler als nicht-200 sind immer noch "erfolgreiche" Antworten. Im Grunde auf der Suche nach einem Muster, um zu helfen seperate Fehler direkt als Ergebnis der Anfrage von jeder anderen zufälligen Fehler, der passiert, weiter aus ändern des Status über den Versand.
- Sorry, was ist der Ursprung der
props.invalidProperty.error
Fehler? Wahrscheinlich lässt sich dies überwinden, indem ein Standardwert für die props, oder eine Standard-Ausgangszustand für Ihre reducer. - Das ist absichtlich eine Eigenschaft, die nicht vorhanden ist, versuche ich, eine Ausnahme auszulösen, die in der Komponente. Geändert code-Beispiel werden immer deutlicher.
- Hier ist ein weiteres Beispiel für die Verwendung der redux async Beispiel: github.com/nandastone/redux/commit/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
Promise.catch
handler auch entdeckt alle Fehler, die ausgelöst werden von der Auflösung oder Ablehnung hf.Behandeln nur die Fehler aus
fetch
und sicherzustellen, dass jeder Fehler, ausgelöst durch den Aufruf vondispatch({ type: 'FETCH_POSTS_SUCCESS', items: json })
in der Auflösung handler ist nicht gefangen in dercatch
handler, fügen Sie eine Ablehnung handlerfetch
.fetch
behandeln nicht-status-codes >= 400 Fehler, so dass der obige Aufruf würde nur abgelehnt werden, wenn es ein Netz oder CORS Fehler, das ist der Grund, warum der status-code muss geprüft werden, in der Auflösung handler.Bitte beachten Sie, dass keine Fehler geworfen, Reagieren die Komponenten verlassen können, Reagieren in einem inkonsistenten Zustand befindet, wodurch verhindert wird, nachfolgende
render
s und die Anwendung reagiert nicht auf UI-Ereignisse. Reagieren Faser - Adressen dieses Problem mit der Fehler-Grenzen.Könnten Sie in Erwägung ziehen, Ihre Fehler-handler in den vorherigen
then
block.Schrieb ich eine einfache demonstration des Prinzips: https://codepen.io/anon/pen/gWzOVX?editors=0011
Dies ist ein block von code aus einem fetch wrapper, die ich schrieb. Sehen Sie
checkStatus
imexecuteRequest
Versprechen Kette, die ist, wo ich Kontrolle, für alle nicht-2xx Antworten mitresponse.ok
. Da meine API-Fehler zurückJSON
ist, ich gehe jede nicht-2xx Antworten zuparseResponse
und dannreject()
analysiert die Fehler-Daten, die wiederum abgelehnt und zurückgegeben wird als ein Fehler vonexecuteRequest
: