Angenommen, ich habe das folgende Markup:
%Vor%Und das folgende Rx.js-Skript:
%Vor% Alles funktioniert wie erwartet. Durch Klicken auf das +/- wird der Zähler inkrementiert / dekrementiert, und durch Klicken auf "RESET" wird er auf Null zurückgesetzt, aber ... Ich habe die Variable "total" ganz oben. Das ist ein Zustand, der, wenn ich die Werte der funktionalen reaktiven Programmierung abonniere, böse ist, nein? Wenn ja, wie behebe ich das? Wenn ich den Reset-Button nicht hätte, könnte ich einfach scan(seed, accumulator)
verwenden, aber die Funktionalität des Reset-Buttons wirft mich auf eine Schleife, wie man es "zustandslos" macht.
Es gibt zwei Möglichkeiten, dies zu tun, die ich sehen kann.
Erstens gibt es nichts, was besagt, dass Sie Ihre Daten in der Pipeline nicht erweitern können:
%Vor% Damit können Sie Downstream signalisieren, dass der Stream zurückgesetzt wurde, indem Sie ein Feld hinzufügen (Hinweis: Ich habe geschummelt, aus Gründen der Lesbarkeit können Sie reset : false
hinzufügen, anstatt sich auf Falschheit zu verlassen, aber es liegt an Ihnen) .
Alternativ können Sie, wenn Sie an reset
denken, den Stream tatsächlich zurücksetzen, stattdessen flatMapLatest
verwenden, um das Inkrementieren und Dekrementieren zu umbrechen:
Das macht den Stream ein bisschen unordentlicher als es sein muss mit der Aufnahme von zwei .startWith
s, um die entsprechenden Sequenzen zu starten, aber wenn Sie gegen eine Erweiterung waren und den implizit vom Stream kontrollierten Zustand wollten, dann dies wäre ein Ansatz.
Folgen Sie @paulpdaniels Antwort, hier ist, was ich mit Ramda verwende:
%Vor% @Jrop Ich mag diesen Operator Rx.Observable.when
. Mit diesem können Sie sehr einfach Bacon.update
reproduzieren. Dies ist mein Code und jsbin Beispiel:
Es wird auch besser sein, wenn Sie sich dieses Join-calculus
ansehen, New Release and Joins
und dies Combining sequences
Tags und Links javascript rxjs counter