合并最新并接受(1)

时间:2018-08-21 13:28:40

标签: javascript rxjs

我有两个带有默认值的BehaviorSubjects $A$B。两者都使用.next(value)在不同的时间更新值。在代码的很多以后,我试图像这样拉取值

 Observable.combineLatest($A, $B)
  .take(1)
  .map(([$a, $b]) => {
    return {
      // stuff
    }
  })
  .subscribe(fn)

我看到的行为很奇怪。我期望Observable可以等待任一主题发出一个值,然后再给我一个可以传递给订阅函数的发出值。但是它只发出值,而$B发出新值。当$A发出时,它将从$B中获取新值,但不会相反。我在做什么错了?

1 个答案:

答案 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