【问题标题】:CombineLatest and take(1)结合最新和采取(1)
【发布时间】:2018-08-21 13:28:40
【问题描述】:

我有两个带有默认值的 BehaviorSubjects $A$B。它们都使用.next(value) 在不同时间更新值。在代码的稍后部分,我试图像这样提取值

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

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

【问题讨论】:

标签: javascript rxjs


【解决方案1】:

combineLatest 运算符在所有源 Observable 发出至少一个项目然后在任何源 Observable 发出每个发射时发出。

所以如果你想要例如。 $A 即使$B 没有发出任何东西,你也可以在每个源前面加上startWith。在结果数组中,您可以检查哪个索引填充了一个值,从而判断源 Observable 是什么。

const a = $A.pipe(startWith(undefined));
const b = $B.pipe(startWith(undefined));

Observable.combineLatest(a, b)
  ...

我猜你这样做是因为你想知道哪个源 Observable 先发出。您可以使用与take(1) 链接的merge 来实现相同的效果,而不是startWith,您可以将每个值映射到唯一可区分的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多