C# 如何打开可观察的<;IObservable<;T>&燃气轮机;变成一个可观察的<;T>;?
假设我有一个函数返回C# 如何打开可观察的<;IObservable<;T>&燃气轮机;变成一个可观察的<;T>;?,c#,.net,f#,observable,reactive-programming,C#,.net,F#,Observable,Reactive Programming,假设我有一个函数返回IObservable,这个函数需要初始状态 let myObservable (initialState: T) :IObservable<T> = (...) 当前resultObservable是IObservable,但我希望它是IObservable,并在初始状态就绪后从myObservable发出值。您可以使用 一般来说,如果您使用提升的类型A,将其降低到T,从T->U投影它,并将其提升到A,则该操作称为bind Observable.bind (f
IObservable
,这个函数需要初始状态
let myObservable (initialState: T) :IObservable<T> = (...)
当前resultObservable是IObservable
,但我希望它是IObservable
,并在初始状态就绪后从myObservable发出值。您可以使用
一般来说,如果您使用提升的类型
A
,将其降低到T
,从T->U
投影它,并将其提升到A
,则该操作称为bind
Observable.bind (fun init -> myObservable init) initializeObservable
或者简化:
initializeObservable |> Observable.bind myObservable
至于你的方法,你差不多做到了
initializeObservable
|> Observable.map (fun initialState -> myObservable initialState)
|> Observable.mergeInner
即使您的
初始化Observable
发出n次,您也可以将所有观察值合并在一起,即使它只发出一次,这同样有效。只需将Observable.map替换为Observable.bind并跳过mergeInner即可,否?或者只是初始化Observable |>Observable.bind MyObservable当然可以。但是,如果您必须使用更高阶的可观测值,您可以根据您的用例使用collect
、merge
或switch
。
Observable.bind (fun init -> myObservable init) initializeObservable
initializeObservable |> Observable.bind myObservable
initializeObservable
|> Observable.map (fun initialState -> myObservable initialState)
|> Observable.mergeInner