假设我有一个返回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发出值。
答案 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)
open FSharp.Control.Reactive.Builders
let result =
observe {
let! s0 = initializeObservable
yield! myObservable s0
}