我有两个带有默认值的BehaviorSubjects $A
和$B
。两者都使用.next(value)
在不同的时间更新值。在代码的很多以后,我试图像这样拉取值
Observable.combineLatest($A, $B)
.take(1)
.map(([$a, $b]) => {
return {
// stuff
}
})
.subscribe(fn)
我看到的行为很奇怪。我期望Observable可以等待任一主题发出一个值,然后再给我一个可以传递给订阅函数的发出值。但是它只发出值,而$B
发出新值。当$A
发出时,它将从$B
中获取新值,但不会相反。我在做什么错了?
答案 0 :(得分:1)
当所有源Observables发射出至少一项,然后从任何源Observable发射出每次发射时,combineLatest
运算符都会发射。
因此,如果您想要例如。 $A
即使$B
尚未发射任何东西也可以发射,您可以在每个源之前加上startWith
。在结果数组中,您可以检查哪个索引中填充了一个值,从而确定什么是源Observable。
const a = $A.pipe(startWith(undefined));
const b = $B.pipe(startWith(undefined));
Observable.combineLatest(a, b)
...
我猜您正在这样做,因为您想知道Observable首先发出哪个源。您只需使用与merge
链接的take(1)
即可达到相同的效果,其中您可以将每个值映射到唯一可区分的内容,而不是startWith
。