2014-11-14 11 views
11

Ich habe ein Szenario, in dem ich das Gefühl habe, dass ich eine Aktion als Reaktion auf eine andere Aktion senden muss, und ich weiß nicht, wie ich das am besten lösen kann.Weitere Aktionen bei der Bearbeitung von Aktionen absetzen

Eine Aktion wird als Antwort auf eine HTTP-Antwort versendet, so etwas wie:

type: 'auth' 
data: { username: 'tom' } 

Da diese Antwort erfolgreich war, möchte ich eine Aktion schicken den Benutzer auf die Homepage zu senden:

type: 'navigate' 
date: { where: 'home' } 

Das scheint mir ein vernünftiger Fluss zu sein: dieses Ding ist passiert, also möchte ich, dass dieses Ding passiert. Das Problem ist, dass der Flux Dispatcher dies nicht erlaubt, da wir uns immer noch im Versandzyklus befinden. Ich verstehe, warum Dispatching während der Disposition eine schlechte Idee ist.

Einige Leute haben dies mit mehreren Dispatcher gelöst, während es scheint, dass die Flux-Autoren sicher sind, dass Sie nur einen brauchen und dass Sie Ihre Geschäfte überdenken müssen.

Ich sehe nicht, wie ich meine Geschäfte umstrukturieren könnte, um dies zu erleichtern, ohne die Absicht zu verschleiern. Mein UserStore weiß über auth Aktionen, und mein RouteStore weiß über navigate Aktionen. Irgendwelche Vorschläge, wie die Geschäfte geändert werden könnten, um dies zu erleichtern, würden geschätzt werden.

Ich fühle mich wie ein setImmediate würde funktionieren, aber es scheint ein bisschen schmutzig. Ich denke auch, dass ein Dispatcher, der Aktionen in die Warteschlange stellte, helfen könnte, aber ich kann in meinen Knochen spüren, dass dies unangenehme Probleme verursachen könnte.

Was ist der beste Ausweg?

Antwort

5

Normalerweise besteht die Lösung für dieses Problem darin, die ursprüngliche Aktion zu sichern und zu betrachten und auf den Wert zu warten, den Sie in der zweiten Aktion senden möchten, wenn ein abgeleiteter Wert erforderlich ist.

In diesem Fall würden Sie nur im UserStore und im RouteStore auf "auth" antworten.

+0

Danke für die Antwort. Es scheint etwas merkwürdig zu sein, dass der Routenspeicher mit Aktionen reagiert, aber ich denke, ich habe noch nicht das Gefühl, dass die Geschäfte richtig liegen. Ich denke, hier kommt die Anwendungslogik in die Läden, was sich ein wenig unangenehm anfühlt, aber andererseits fühlen sich die meisten von React/Flux zunächst rückwärts und dann am Ende viel besser als der "alte Weg"! – Tom

+0

Ich werde das ausprobieren und die Antwort akzeptieren, wenn es klappt. Ich muss meinen Router vielleicht ein wenig nachjiggen. – Tom

+0

Stores sollten neben Ihrem Anwendungsstatus fast die gesamte Anwendungslogik enthalten. Sie sind der Ort aller Kontrolle innerhalb einer Flux-Anwendung. Man könnte eine Parallele ziehen zwischen Flux speichert das Ideal von "Fettmodellen" in einigen MVC-Gemeinschaften, wie Rails. Sie sind "fett", weil dort der ganze Staat und die Logik lebt. – fisherwebdev

7

Sie sollten zurückblicken, wie Sie diesen Fluss erstellen möchten.

Sie sagen, dass Sie eine Aktion als Reaktion auf eine andere Aktion erstellen müssen, richtig? Also, nennen wir das "ActionForwarderStore".

Wir enden mit einer Strömung wie folgt auf:

AuthAction --> Dispatcher --+--> UserStore 
          | 
          +--> ActionForwarderStore --+ 
                 | 
      +--------------------------------------------+ 
      | 
      +-> Dispatcher -----> RouteStore 

Sie sehen, dass Sie noch jemand haben, der versteht, dass ein AuthAction sollte eine Route zu ändern enden? Dies ist die ActionForwarderStore. Da Flux vorschlägt, dass jeder Store jeder Aktion zuhört, kann dieses Wissen des AuthAction, das in einem Routenwechsel endet, direkt in RouteStore gehen. Gefällt mir:

Denken Sie daran, dass Flux "erstellt" wurde, um die Unvorhersehbarkeit von MVC zu vermeiden. Wenn Sie alle Routenänderungen in RouteStore ändern, müssen Sie sich nur diesen Code ansehen, um zu verstehen, welche Aktionen eine Routenänderung verursachen. Wenn Sie eine Aktion als Reaktion auf eine andere Aktion erstellen, werden Sie nur wissen, dass NavigateAction Routen ändert, und Sie müssen sich die anderen Stores ansehen, um zu überprüfen, welche diese Aktion als Reaktion auf andere auslösen.

Dies ist, was Flux als "unidirektionaler Fluss" bezeichnet. Es ist einfach, Probleme auf diese Weise zu erfassen, da dies der einzige erlaubte Fluss ist. Wenn Sie auf eine Schaltfläche klicken und die Route ändert, können Sie sicher sein, dass die Aktion, bei der der Klick ausgelöst wurde, die Änderung der Route verursacht. Es gibt keine kaskadierenden Aktionen.