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:

  1. fetchPosts action Schöpfer genannt wird
  2. Ein HTTP-request gemacht wird, und nach der Antwort eine FETCH_POSTS_SUCCESS Aktion ausgelöst wird.
  3. Die Komponente wird jetzt aktualisiert, mit den daraus resultierenden Elemente in den Staat und versucht zu Lesen props.invalidProperty.error
  4. 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/...
InformationsquelleAutor Matt Stone | 2017-05-12
Schreibe einen Kommentar