首页 > 解决方案 > 如何打开 IObservable> 进入 IObservable?

问题描述

假设我有一个返回的函数,IObservable<T>这个函数需要初始状态。

let myObservable (initialState: T) :IObservable<T> = (...)

但我只能从另一个只发射一次的可观察对象获得初始状态

let initializeObservable: IObservable<S> = (...)

我怎样才能将这两者结合起来得到IObservable<T>

let resultObservable = initializeObservable |>
                       Observable.map (fun initialState -> myObservable initialState)

目前 resultObservable 是IObservable<IObservable<T>>,但我希望它是IObservable<T>并在初始状态准备好后从 myObservable 发出值。

标签: c#.netf#observablereactive-programming

解决方案


一般来说,如果你拿一个高架类型A<T>,将它降低到T,从它投射到它,T -> U然后将它提升到获取A<U>,这个操作被称为bind

Observable.bind (fun init -> myObservable init) initializeObservable

或简化:

initializeObservable |> Observable.bind myObservable

至于你的方法,你几乎就在那里。

initializeObservable 
|> Observable.map (fun initialState -> myObservable initialState)
|> Observable.mergeInner

即使您initializeObservable发出 n 次,您也可以将所有 observable 合并在一起,即使它只发出一次,这也是同样有效的。


推荐阅读