Ich habe eine beobachtbare Kette, die anfängliche Observable stammt aus dem Netzwerk und wird jedes Mal ausgelöst, wenn die Nachricht zum Lesen bereit ist. Der nächste Handler liest dann die Nachricht und deserialisiert sie. Jetzt habe ich eine Gabelung des Observablen, der eine ist der Nachrichtenhandler und der andere protokolliert die Nachricht.f # beobachtbare Gabel und Nebeneffekt
Das Problem ist, dass, weil ich Observable benutze ich tatsächlich versuchen werde, die Nachricht zweimal zu lesen.
Ich verstehe, dass die Verwendung von Event anstelle von Observable das Problem lösen wird, jedoch habe ich dann ein Garbage Collection-Problem, das dazu führen kann, dass Sockets nicht erfasst werden.
Eine Lösung, an die ich gedacht habe, ist das Einfügen einer Art Trennzeichen, die eine Kette von Observablen beendet und eine neue erzeugt, existiert eine solche Funktion bereits als Teil von fsharp oder einer anderen Bibliotheksbibliothek.
Gibt es andere Lösungen für das Problem?
Edit:
Codebeispiel, das nicht richtig
let messagesStream =
socket.observable |>
Observable.map (fun() -> socket.read()) |>
Observable.map (fun m -> deserialize m)
messagesStream |> Observable.add (fun m -> printf m)
messagesStream |> Observable.add (fun m -> handle m)
Auf der Seite: Sie sollten die vorderen Rohre setzen * vor * die Funktion in ihr Rohr, nicht hinter * * der Wert, den Sie Rohr. Wenn man sie so aufstellt, wird deutlich, was vor sich geht. – TeaDrivenDev
Jede Subskription für eine beobachtbare Pipeline verursacht eine Subskription der beobachtbaren Quelle. Sie erstellen zwei Subskriptionen für die Datei "socket.observable". Sie sollten versuchen, einen Veröffentlichungsoperator am Ende des messagesStream-Objekts zu platzieren. – Enigmativity
Danke, ich habe über eine Veröffentlichung gefunden, weißt du irgendeine Bibliothek für f # mit Veröffentlichungsfunktion? Wenn Sie eine Antwort und ein Codebeispiel hinzufügen können, werde ich das als Antwort markieren. Danke – somdoron