1

我有许多事件被合并到一个执行某些命令的 observable 中。如果命令成功,则会产生一些结果。此外,应记录该命令。

就代码而言,这看起来像

    let mevts = modifyingevents |> Observable.filter exec_action
                    |> Observable.add (fun action -> self.OutlineEdited <- true)

该函数exec_action会导致一些副作用,例如编辑树视图。如果成功,则属性OutlineEdited设置为true

我希望用类似的东西来遵循这个

    mevts |> Observable.scan (fun log action -> action::log) []

但事实证明Observable.filter每个订阅的观察者执行一次。这意味着副作用将重复出现。

您能否建议另一种方法来实现相同的结果而无需exec_action执行两次?如果可能的话,我希望避免使用可变变量。

4

1 回答 1

2

这个例子很好地说明了IObservable<'T>类型(在这个例子中通过Observable模块使用)和 F# 类型IEvent<'T>(以及Event模块中的函数)之间的区别。

当您使用observables时,每个订阅者都会创建一个新的操作链(因此每个订阅者都会执行一次副作用)。如果你使用事件,那么状态是共享的,副作用只执行一次(不管订阅者的数量)。另一方面,当您从事件中删除所有订阅者时,事件不会被垃圾收集。

因此,如果您不需要在删除所有订阅者时删除事件,您应该通过使用Event而不是获得您想要的行为Observable

modifyingevents 
|> Event.filter exec_action 
|> Event.scan (fun log action -> action::log) [] 
于 2012-10-14T01:19:14.853 回答