(Hinweis: Meine Frage war nicht klar geschrieben, und ich dachte über einige Dinge falsch. Die aktuelle Version der Frage ist nur ein Versuch, etwas zu schreiben, das die akzeptierte Antwort für so viele Menschen wie möglich nützlich machen könnte.)
Ich möchte eine Aktion haben, die ein Element zu einem Geschäft hinzufügt und es mit einer externen Abhängigkeit registriert.
Ich könnte die Thunk-Middleware verwenden und schreiben
%Vor%Aber die Abonnenten würden benachrichtigt, bevor der Artikel registriert wurde, und sie könnten davon abhängen, dass sie registriert wurden.
Ich könnte die Reihenfolge umkehren und schreiben
%Vor%Aber ich verfolge das Element in der externen Abhängigkeit durch eine eindeutige ID, die nur im Reduzierer zuzuweisen ist.
Ich könnte das Element im Reducer registrieren, aber ich muss verstehen, dass es sehr schlechte Form ist, Nebenwirkungen in einem Reducer zu machen und zu Problemen auf der ganzen Linie führen kann.
Was ist der beste Ansatz?
(Meine Schlussfolgerung ist: Es gibt eine Reihe von Ansätzen, die funktionieren würden, aber wahrscheinlich ist die beste für meinen Anwendungsfall das Speichern eines Handles in der externen Abhängigkeit in Redux und nicht ein Handle in Redux in der externen Abhängigkeit.)
Wenn Sie die Middleware Redux Thunk verwenden, können Sie sie in einem Aktionsersteller einkapseln:
%Vor%Ausarbeitung basierend auf den Kommentaren zu dieser Antwort:
Dann ist das vielleicht das falsche Muster für meinen Fall. Ich möchte nicht, dass Abonnenten zwischen
dispatch(addItem(id))
unddoSomeSideEffect()
aufgerufen werden.
In 95% der Fälle sollten Sie sich nicht darum kümmern, ob die Abonnenten aufgerufen wurden. Bindungen wie React Redux werden nicht erneut gerendert, wenn sich die Daten nicht geändert haben.
Würde
doSomeSideEffect()
in den Reducer setzen ein akzeptabler Ansatz oder hat es versteckte Fallstricke?
Nein, es ist niemals akzeptabel, Nebenwirkungen in den Reducer zu setzen. Dies widerspricht der zentralen Prämisse von Redux und bricht so ziemlich jedes Tool in seinem Ökosystem: Redux DevTools , Redux-Rückgängigmachen , jede Record / Replay-Lösung, Tests usw. Tue dies niemals.
Wenn Sie wirklich eine Nebenwirkung zusammen mit einer Aktion ausführen müssen, und Sie wirklich darauf achten, dass Abonnenten nur einmal benachrichtigt werden, senden Sie einfach eine Aktion und verwenden [Redux Thunk], um "attach" eine Nebenwirkung dazu:
%Vor% In diesem Fall müssten Sie ADD_ITEM
von verschiedenen Reduzierern behandeln. Es ist nicht erforderlich, zwei Aktionen zu versenden, ohne die Abonnenten zweimal zu benachrichtigen.
Hier ist der eine Punkt, den ich immer noch nicht verstehe. Dan schlug vor, dass die Thunk-Middleware die Benachrichtigung der Abonnenten nicht zurückstellen konnte, da dies einen häufigen Anwendungsfall mit Async-Anfragen beeinträchtigen würde. Ich verstehe das immer noch nicht.
Bedenken Sie Folgendes:
%Vor% Wann möchten Sie, dass die Abonnements benachrichtigt werden? Definitiv, wenn wir die Abonnenten nur benachrichtigen, wenn der Thunk beendet wird, werden wir sie überhaupt nicht für C
und D
benachrichtigen.
Wie dem auch sei, das ist mit der aktuellen Middleware-Architektur unmöglich. Middleware soll Abonnenten nicht daran hindern, zu feuern.
Was Sie jedoch beschrieben haben, kann mit einem Store-Enhancer wie redux-batched-subscribe erreicht werden. Es hat nichts mit Redux Thunk zu tun, aber es bewirkt, dass jede Gruppe von Aktionen, die synchron gesendet werden, entprellt wird. Auf diese Weise erhalten Sie eine Benachrichtigung für A
und B
und eine weitere Benachrichtigung für C
und D
. Das heißt, das Schreiben von Code auf dieses Verhalten wäre meiner Meinung nach fragil.
Ich lerne immer noch Redux; aber mein Bauchgefühl sagt, dass dies ein potenzieller Kandidat für einige benutzerdefinierte Middleware sein könnte?
Tags und Links javascript redux