【问题标题】:How to switch to another Observable when a source Observable emits but only use latest value当源 Observable 发出但仅使用最新值时如何切换到另一个 Observable
【发布时间】:2017-07-13 09:35:42
【问题描述】:

我有两个 observables

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

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

我能够通过使用 withLatestFrom 来完成 (A),但这并不满足 (B),因为 withLatestFrom 不会忽略源 observable。

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

我查看了满足 (B) 但不满足 (A) 的 switchMapTo,但同时不使用 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) 或未使用的参数的原因并不是很明显。

有没有其他方法可以组合两个可观察对象,以便每当第一个可观察对象发出时,新的可观察对象只发出第二个可观察对象的最新值?

【问题讨论】:

    标签: javascript rxjs reactive-programming


    【解决方案1】:

    withLatestFrom 采用可选的 project 函数,该函数已传递值。

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

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

    【讨论】:

    • 谢谢,这正是我所需要的。我什至没有意识到有一个回调。
    • 不用担心。 RxJS 中有许多运算符采用可选的project 函数,因此请留意它们。它们可能很有用。
    • 这个问题在谷歌上很快出现,所以也许我们可以改进它,提到投影已被删除,OP 建议的两种方法是现在要走的路(或为其编写自定义运算符) ?
    • @Ingo 是的,它可能与更新有关。您是否有足够的代表为我更改它?
    【解决方案2】:

    使用“样本”运算符 在你的情况下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多