繁体   English   中英

如何打开 IObservable <iobservable<t> &gt; 进入 IObservable<t> ? </t></iobservable<t>

[英]How do I turn an IObservable<IObservable<T>> into an IObservable<T>?

假设我有一个返回IObservable<T>的 function ,而这个 function 需要初始 state。

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

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

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

如何将这两者结合起来获得IObservable<T>

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

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

一般来说,如果您采用提升的类型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 合并在一起,即使它只发出一次也是同样有效的。

您可以使用F# 反应式扩展:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM