React and Flux: "Versand mitten in einem Versand", um eine Fehlermeldung von einem API-Aufruf anzuzeigen

8

Ich verwende Flux, React und ich habe die Komponenten Simple und Messages:

  • Einfach : Dies ist eine einfache Komponente, die eine API über eine Aktion aufruft. Die Aktion führt eine Ajax-Anfrage aus und sendet das Ergebnis in jqXHR.done() . Einfach einen Change-Listener haben, um den Versand des Ergebnisses abzuwarten. Wenn das Ergebnis null ist, möchte ich einen Fehler mit meiner Nachrichten-Komponente anzeigen, also rufe ich mein MessagesAction.addError('My result is null') .
  • auf
  • Nachrichten : Eine Komponente, die Fehler für die Anwendung anzeigt. Diese Komponente hat einen Change-Listener, der darauf wartet, dass neue Nachrichten angezeigt werden. Es ist in der Kopfzeile meiner Anwendung platziert.

Das Problem tritt auf, wenn ich das Null-Ergebnis erhalte und sofort MessagesAction.addError in der Simple-Komponente aufruft. In der Tat, ich weiß, dass dies zu " Versand mitten in einem Versand " -Fehler führen kann, aber ich weiß nicht, wie diesen Code umgestalten, um die Fehlermeldung mit Flux anzuzeigen.

Haftungsausschluss 1 : Ich kann setTimeout function nicht verwenden, um dieses Problem zu lösen. Dies ist nicht die richtige Lösung.

Haftungsausschluss 2 : Die Simple -Komponente repräsentiert jede andere Komponente aus der App, die eine Nachricht auch über die Nachrichten-Komponente anzeigt.

Einfacher Code:

%Vor%

Nachrichtencode:

%Vor%

Danke!

    
Dherik 09.03.2016, 12:45
quelle

2 Antworten

4

Nun, das Problem ist, dass (zumindest in der Dispatcher-Implementierung von Facebook) keine Aktion innerhalb der Speicherrückrufe ausgelöst werden muss, was zu unerwünschtem / unvorhersehbarem Verhalten führen würde, wie unendliches Dispatching oder inkonsistente Zustandsänderungen (zB Race Conditions) . Dies liegt an der Natur eines einzelnen Sende-Dispatchers.

Die sauberste Lösung des IMHO (ohne Riechen waitFor() ) besteht darin, einen internen Zustand in die auslösende Komponente einzuführen. Mit dem Status triggern Sie Ihre Nachrichtenaktion im nächsten Aktualisierungszyklus. Auf diese Weise haben Sie nicht das Problem nicht fertiggestellter Versandzyklen.

%Vor%     
ohager 24.03.2016, 22:25
quelle
4

Ihr Top-Level-Container sollte auf Änderungen sowohl im UserStore als auch im MessageStore warten.

Der MessageStore sollte den Benutzerspeicher "warten", seinen Status ableiten (d. h. seine Nachrichteneigenschaft aktualisieren) und anschließend eine Änderung ausgeben.

In etwa so: Top UserContainer-Komponente

%Vor%     
Mark 09.03.2016 14:33
quelle

Tags und Links