Ich verwende Redux Thunk behandeln, um Server zu versenden asynchronen Aktionen wie das Abrufen und veröffentlichen. Jeder Aktionsersteller-Aufruf gibt eine Zusage zurück, die aufgibt, wenn nach einem Ajax eine Zauberei ausgeführt wurde, und Redux hat tatsächlich die korrekte Aktion zum Aktualisieren des Status gemäß Erfolg/Fehlschlag von Ajax ausgelöst. Auf diese Weise können wir den Rückruf nach dem Versand auf Komponentenebene anpassen.Wie Server/Anschluss Ausnahmen mit Reagieren und Redux thunk in einer verwaltbaren Weise
doPostActionCreator(data) {
return dispatch => {
return httpService.post(data) {
.then(response => {
dispatch({type: POST_SUCCESS, data: response})
return response
})
.catch(error => {
dispatch({type: POST_ERROR})
return error
)}
}
}
}
-
componentsDoPostHandler(data) {
this.props.doPostActionCreator(data)
.catch(error => {
alert(error)
this.setState({...})
})
}
Alles ist mit diesem einfachen Beispiel in Ordnung, aber wenn ich versuche, echte Fehler einzuführen dieses Muster Behandlungslogik, wie der Aufruf componentsDoPostHandler rekursiv aus fangen und zu brechen, wenn der Zähler Limit überschreitet, beginnen die Dinge hässlich aussehen, schwer zu pflegen und leicht zu brechen. Was macht denkt noch komplizierter, in meiner realen Welt Szenario ist this.props.doPostActionCreator
tatsächlich ein Rückruf von fetchCsrfTokenActionCreator
, die sich dieselbe Fehlerbehandlungslogik muss, versucht X-mal zu holen und etwas anderes zu tun, wenn das fehlschlägt. Nun, wenn eine Seite zwei verschiedene Behälter enthält, und sie beide vorstellen, diese Logik, es ist ein ganzes Durcheinander von Bergungsaktionen des letzteren geschickt zu werden, nachdem erstes hat bereits die Erholung durchgeführt, da es nicht möglich ist, einmal Schöpfer genannt Aktion abzubrechen. Am Ende ist es schwer zu lesen, wie das Programm funktioniert und "nicht synchronisierte" Aktionsprobleme entstehen, die Anwendung in einem inkonsistenten Zustand bringt, und diese Probleme sind schwer zu verfolgen.
Das macht mich wundern, wenn ein Versprechen von Aktion Schöpfer Rückkehr eigentlich ein Anti-Muster ist, die schließlich zu wartbaren Code führt. Ich habe keine realen Beispiele dafür gefunden, wie man mit Hilfe von React/Redux-Stack mit asynchronen Service-Fehlern umgehen kann. Mache ich es falsch? Gibt es eine sauberere Möglichkeit, asynchrone Ausnahmen zu behandeln (idealerweise X-mal zu versuchen, Benutzer zu warnen und zur Anmeldeseite zurückzukehren), alles konsistent zu halten, einfach zu verstehen, zu verwalten und asynchrones Chaos zu vermeiden?
Jede mögliche reale Welt Beispiel über das Thema hoch
yep im Allgemeinen verwende ich dieses Muster. Meine Thunks geben nie etwas zurück. Meine Komponenten rufen die Action-Ersteller einfach auf eine "Feuer und Vergessen" -Methode auf und versuchen niemals etwas mit einem Rückgabewert von einem Aktionsersteller zu tun. Das fehlgeschlagene Versprechen aktualisiert den Reduxstatus mit dem Fehler. Die Komponente sieht diesen Fehlerstatus und kann dann weitere Aktionen ausführen, wenn sie dies wünscht. Oder Sie können veranlassen, dass der Thunk intern erneut versucht ... es könnte sogar zusätzliche Argumente annehmen, die die Komponente bereitstellt, wenn sie den Aktionsersteller aufruft, der ihr sagt, wie sie den erneuten Versuch handhaben soll. – Brandon
Wie würde ich sicherstellen, dass diese Methode verwendet, dass gleichzeitige Abrufe mit unterschiedlicher Geschwindigkeit nicht zu einer Situation führen, in der der Fehler durch den ersten fehlgeschlagenen Abruf zur Anmeldeseite führt, der Status gelöscht wird und danach der zweite Abruf fehlschlägt und fehlschlägt Zustandskonsistenz. Ich habe von Redux Saga gehört, um Aktionen zu unterbrechen, möchte aber keinen weiteren Rahmen einführen. Was ist auch eine gute Praxis, um den Fehlerzustand in Redux zu überprüfen und zu behandeln? Allgemeine Oberseiten-PageComponent vielleicht, die FailComponent bei einem Fehler rendern würde, der bei Mount-Versendungen zur Login-Aktion zurückkehrt? –
Ergänzung zu vorherigen: Ich bin besorgt, dass jede Präsentationskomponente nicht versucht, nach Fetch-Fehler zu rendern, wie sie versuchen, auf Karte und andere Funktionen von Daten zugreifen, die zu diesem Zeitpunkt nicht existiert –