如何在源Observable发出但仅使用最新值时切换到另一个Observable

时间:2017-07-13 09:35:43

标签: javascript rxjs reactive-programming

我有两个可观察者

  • load$是一个加载事件流,在启动时或单击重新加载按钮时发出
  • selection$是一个选定列表项的流,在选择列表项时会发出

我想知道是否有一个运算符让我(A)在selection$发出时获取load$发出的最新值,而(B)忽略load$发出的值1}}。

我能够通过使用withLatestFrom来完成(A)但不满足(B)因为withLatestFrom不会忽略源可观察性。

load$.withLatestFrom(selection$).subscribe(([_, latestSelection) => {
  // _ is not needed and I don't like to write code like this
  // I only need the latest selection
});

我已经查看switchMapTo满足(B)但不满足(A)而不使用first()take(1)

load$.switchMapTo(selection$.take(1)).subscribe(latestSelection => {
  // I would like to avoid having to use take(1)
});

我正在寻找一个假设的switchMapToLatestFrom运营商。

load$.switchMapToLatestFrom(selection$).subscribe(latestSelection => {
  // switchMapToLatestFrom doesn't exist :(
});

不幸的是它并不存在,我不喜欢我提出的另外两种方式,因为代码中包含take(1)或未使用的参数的原因并不明显。

是否还有其他方法可以组合两个observable,以便只要第一个observable发出,新的observable就会从第二个observable中发出最新的值?

2 个答案:

答案 0 :(得分:5)

withLatestFrom使用可选的project函数传递值。

您可以使用它忽略load$中的值并仅发出最新选择:

load$
  .withLatestFrom(selection$, (load, selection) => selection)
  .subscribe(selection => {
    // ...
  });

答案 1 :(得分:1)

使用“样本”运算符 就您而言:

selection$.pipe(sample(load$)).subscribe(
   // the code you want to run
)