关于Rx的CombineLatest和默认初始值

About Rx's CombineLatest and default initial values

给定 2 种类型 AB,默认值 d(A)d(B)。 和 2 个主题:

let sa = new Subject<A>()
let sb = new Subject<B>()

还有一个 f 类型的函数 A -> B -> C

我创建了这个 observable:

let o = Observable.CombineLatest(sa, sb, f)

但是,我需要 o 来生成基于 d(A)d(B) 的初始值。文档说 CombineLatest 只会在两个主题都产生第一个输出后才产生第一个输出。

我有 2 种方法,但我不知道哪种可行/哪种最好,或者我是否缺少一些已经满足我需要的运算符。

我想到的第一个方法是在o的相关订阅完成后,使用默认值手动调用OnNextsasb

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

感谢阅读。

附录 我已经确认第二种方法有效,但我仍然不知道引入 BehaviorSubject 而不是普通的 Subject 是否最适合这种情况。

使用StartWith怎么样?

public static Observable<T> StartWithDefault(this Observable<T> observable) {
    return observable.StartWith(default(T));
}

然后:

sa.StartWithDefault().CombineLatest(sb.StartWithDefault(), f)