F#对事件有一个相当不错的语法,可以作为observable订阅而没有任何自定义代码用于此目的。我正在创建一个发布成员变量更新的事件。我打算订阅这个事件作为一个observable,但我希望现有的值(我知道存在)推送到订阅。这对事件语法是否可行且简单,或者我是否需要使用例如创建适当的observable来创建BehaviorSubject?
答案 0 :(得分:1)
这很大程度上取决于您打算如何使用它。
当您从事件转换为observable时,EventArgs将作为observable的类型进行映射。对于“标准”事件,这将没有值(EventArgs
不包含任何信息)。
但是,您可以轻松地使用自定义事件类型,或违反正常.NET事件准则的事件并使用值本身:
let evt = Event<int>()
let obs = evt.Publish :> IObservable<_>
obs |> Observable.add (fun v -> printfn "New value: %d" v)
evt.Trigger 3
evt.Trigger 4
话虽如此,根据您的使用案例,您可能需要查看Gjallarhorn。该库专门用于跟踪可变值的变化并很好地发出信号。它围绕“信号”的概念构建,“信号”是包含当前值的可观察量。这使得上述概念成为第一类 - 您可以传递可以在需要时直接用作IObservable的东西(信号),但也可以始终用于获取基础的当前值。实际上,这大大简化了许多用例。