关于Rx的CombineLatest和默认初始值
About Rx's CombineLatest and default initial values
给定 2 种类型 A
和 B
,默认值 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
的相关订阅完成后,使用默认值手动调用OnNext
到sa
和sb
。
我的第二种方法是使用 BehaviorSubject
s 而不是普通的 Subject
s,使用初始值创建它们,并希望 CombineLatest 将其用于其第一个输出。
感谢阅读。
附录
我已经确认第二种方法有效,但我仍然不知道引入 BehaviorSubject
而不是普通的 Subject
是否最适合这种情况。
使用StartWith
怎么样?
public static Observable<T> StartWithDefault(this Observable<T> observable) {
return observable.StartWith(default(T));
}
然后:
sa.StartWithDefault().CombineLatest(sb.StartWithDefault(), f)
给定 2 种类型 A
和 B
,默认值 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
的相关订阅完成后,使用默认值手动调用OnNext
到sa
和sb
。
我的第二种方法是使用 BehaviorSubject
s 而不是普通的 Subject
s,使用初始值创建它们,并希望 CombineLatest 将其用于其第一个输出。
感谢阅读。
附录
我已经确认第二种方法有效,但我仍然不知道引入 BehaviorSubject
而不是普通的 Subject
是否最适合这种情况。
使用StartWith
怎么样?
public static Observable<T> StartWithDefault(this Observable<T> observable) {
return observable.StartWith(default(T));
}
然后:
sa.StartWithDefault().CombineLatest(sb.StartWithDefault(), f)