我有一個可觀察的鏈,最初的觀察者來自網絡,並且每當消息準備被讀取時就會被觸發。接下來的處理程序然後讀取消息並將其反序列化。現在我有一個observable分支,一個是消息處理程序,另一個是記錄消息。f#可觀察到的叉子和副作用
的問題是,因爲我觀察到的使用我實際上將嘗試讀取消息的兩倍。
據我所知,使用事件,而不是可觀察就能解決問題,但我會再有一個垃圾收集問題,可能導致無法收集套接字。
一種解決方案我想的是插入某種分離器的其中可觀察結束的一個鏈,並創建一個新的,不這樣的功能已經存在作爲fsharp或其它文庫庫的一部分。
是否有其他解決方案?
編輯:
代碼示例不正常工作
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)
在一邊:你應該把推進管道* *前的功能,你管到,不*背後*值你管。將它們排列起來使得它更清晰。 – TeaDrivenDev
對ab可觀察管道的每個訂閱都會導致訂閱源可觀察項。您正在爲'socket.observable'創建兩個訂閱。您應該嘗試在'messagesStream' observable的末尾放置一個發佈操作符。 – Enigmativity
謝謝,我發現關於發佈,你知道任何與發佈功能的f#庫嗎?如果您可以添加答案和代碼示例,我會將其標記爲答案。謝謝 – somdoron