1

いくつかのコマンドを実行する 1 つのオブザーバブルにマージされる多数のイベントがあります。コマンドが成功すると、なんらかの結果が発生します。さらに、コマンドをログに記録する必要があります。

コード的にはこんな感じ

    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は、サブスクライブしたobserverごとに1回実行されることがわかりました。副作用が繰り返されることを意味します。

exec_action2回実行せずに同じ結果を達成する別の方法を提案できますか? 可能であれば、可変変数を使用する必要がないようにしたいと考えています。

4

1 に答える 1

2

IObservable<'T>この例は、型 (この例ではモジュールを介して使用Observable) と F# 型IEvent<'T>(およびモジュール内の関数)の違いをうまく示していますEvent

observablesを使用すると、すべてのサブスクライバーが新しい一連の操作を作成します (したがって、サブスクライバーごとに副作用が 1 回実行されます)。イベントを使用すると、状態が共有され、副作用は (サブスクライバーの数に関係なく) 1 回だけ実行されます。一方、イベントからすべてのサブスクライバーを削除すると、イベントはガベージ コレクションされませ

したがって、すべてのサブスクライバーが削除されたときにイベントを削除する必要がない場合は、次のEvent代わりに使用するだけで、必要な動作を取得する必要がありObservableます。

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