【问题标题】:Publishing "existing event value" upon subscription订阅时发布“现有事件值”
【发布时间】:2017-08-23 19:09:26
【问题描述】:

F# 有一个相当不错的事件语法,它可以作为 observables 订阅,而无需任何自定义代码。我正在创建一个将更新发布到成员变量的事件。我打算将此事件订阅为可观察的,但我希望将现有值(我知道存在)推送到订阅中。这对事件语法是否可行且简单,或者我是否需要使用例如创建一个适当的可观察对象?行为主体?

【问题讨论】:

  • “现有价值”是什么意思?在引发事件的那一刻,只有一个与事件关联的值。虽然你说的话让我想起了 Gjallarhorn 的信号。 github.com/ReedCopsey/Gjallarhorn
  • 我在考虑可观察对象。事件将更新发布到某些成员变量。我已经在问题中澄清了这一点。
  • 这正是 Gjallarhorn 的动机。 Observable 没有值。 Gjallarhorn 的 ISignal 用这个精确的概念扩展了 observable。

标签: f#


【解决方案1】:

这在很大程度上取决于您打算如何使用它。

当你从一个事件转换为一个可观察对象时,EventArgs 被映射为可观察对象的类型。对于“标准”事件,它没有值(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,但也总是可以用来获取底层的当前值。在实践中,这极大地简化了许多用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多