关于Rx的CombineLatest和默认初始值

Lay*_*lez 6 .net f# system.reactive

给出2种类型AB默认值d(A)&d(B).和2个主题:

let sa = new Subject<A>()
let sb = new Subject<B>()
Run Code Online (Sandbox Code Playgroud)

f类型的功能A -> B -> C

我创建了这个可观察的:

let o = Observable.CombineLatest(sa, sb, f)
Run Code Online (Sandbox Code Playgroud)

但是,我需要o根据d(A)&生成初始值d(B).文档说,一旦两个主题产生了他们的第一个输出,CombineLatest只会产生它的第一个输出.

我有两种方法,但我不知道哪种方法可行/哪种方法最好,或者我是否遗漏了一些已经做了我需要的运算符.

我来到了第一种方法是手动调用OnNextsasb到相关的订阅后的默认值o已经作出.

我的第二种方法是使用BehaviorSubjects而不是plain Subjects,用初始值创建它们,并希望CombineLatest将它用于它的第一个输出.

谢谢阅读.

附录 我已经确认第二种方法有效,但我仍然不知道在这种情况下引入一个BehaviorSubject而不是一个平原Subject是最好的.

Cra*_*ney 16

怎么用StartWith

public static Observable<T> StartWithDefault(this Observable<T> observable) {
    return observable.StartWith(default(T));
}
Run Code Online (Sandbox Code Playgroud)

然后:

sa.StartWithDefault().CombineLatest(sb.StartWithDefault(), f)
Run Code Online (Sandbox Code Playgroud)

  • 实际上有一个 `.StartWith` 操作,特别是对于这种情况。 (3认同)