如何将IObservable <IObservable <T >>转换为IObservable <T>?

时间:2020-06-22 15:50:14

标签: c# .net f# observable reactive-programming

假设我有一个返回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发出值。

2 个答案:

答案 0 :(得分:4)

通常,如果您使用高架类型A<T>,将其降低到T,从T -> U投射它,然后将其抬起以获得A<U>,该操作称为{ {1}}。

bind

或者为了简化:

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

关于您的方法,您就在那儿。

initializeObservable |> Observable.bind myObservable

即使您的initializeObservable |> Observable.map (fun initialState -> myObservable initialState) |> Observable.mergeInner 发射了n次,您也可以将所有可观测对象合并在一起,即使它仅发射一次也同样有效。

答案 1 :(得分:1)

您可以使用F# Reactive extensions:

open FSharp.Control.Reactive.Builders
   
 let result  = 
        observe {
            let! s0 = initializeObservable
            yield! myObservable s0
        }