有副作用F#观察到的过滤器(F# observable filter with side effec

2019-09-24 02:00发布

我有一个数字,被合并成一个可观察执行一些命令的事件。 如果命令成功的一些结果发生。 此外,该命令应被记录。

在代码方面,这看起来像

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

其中函数exec_action导致某些副作用如编辑一个TreeView。 如果成功则该属性OutlineEdited设置为true

我希望能按照这个喜欢的东西

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

但事实证明, Observable.filter为每个订阅观察员执行一次。 这意味着副作用将被重复。

能否请您提出另一种方式来实现,而不具有相同的结果exec_action执行两次? 我希望,以避免如果可以使用可变变量。

Answer 1:

本实施例中很好地ilustrates的之间的差IObservable<'T>类型(通过在此实施例中使用Observable模块)和F#类型IEvent<'T>和功能在Event模块)。

当您使用观测 ,每个用户创建新的行动链(这样的副作用是为每个用户执行一次)。 如果你使用的事件则状态共享和副作用只是执行一次(不考虑用户的数量)。 在另一方面,这些事件没有得到垃圾当你从一个事件中删除所有用户收集。

所以,如果你不需要的事件时,所有订户被删除到被删除,你应该得到的行为,你只想使用Event ,而不是Observable

modifyingevents 
|> Event.filter exec_action 
|> Event.scan (fun log action -> action::log) [] 


文章来源: F# observable filter with side effect