![](/img/trans.png)
[英]Turn an IObservable<IEnumerable<T>> into an IEnumerable<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.