【问题标题】:Rxjs - combine 2 streams and only emit if previous trueRxjs - 组合 2 个流,仅在先前为 true 时发出
【发布时间】:2020-06-15 21:55:35
【问题描述】:

有没有办法只在先前的值为真时才发出并以串行方式

例如(但不使用种族):

 race(this.firstObservable$, this.secondObservable$).subscribe(
      //do Something
    );

但是如果 firstObservable 返回 false,我不希望调用 secondObservable。

【问题讨论】:

  • serial fashion 是什么意思? don't want secondObservable to be called - 被调用,你的意思是被订阅还是发出值?
  • 已订阅。例如,这是一个我根本不想被调用的 API 调用。
  • 你试过类似concat(first$.pipe(filter(v => !!v)), second$)吗?

标签: rxjs


【解决方案1】:

可以过滤observable的第一个值,如果值为true,则switchMapTo第二个流:

this.firstObservable$.pipe(
  filter(v => v === true),
  switchMapTo(this.secondObservable$)
);

【讨论】:

  • 这仅适用于第一次发射。在管道切换到它一次后,它不会阻止 secondObservable 发射。
  • @JonathanStellwag 这是故意的
  • 好的。然后对不起。我对要求的解释不同。如果是故意的,那么这个解决方案绝对没问题。
【解决方案2】:

您需要mergeMap 的一些变体来处理它。 @eliya-cohen 的答案是一种选择,另一种选择是:

this.firstObservable.pipe(
  // If the source will only ever return one value then this is not necessary
  // but this will stop the first observable after the first value
  take(1), 
  // Flattens to an empty observable if the value is not truthy
  flatMap(x => iif(() => x, this.secondObservable$))
)

【讨论】:

    【解决方案3】:

    基本上你可以使用filter操作符,然后使用高阶可观察操作符switchMap(从前一个内部可观察对象中取消订阅),mergeMap(保留之前的内部可观察子对象),etc.(取决于根据您的需要)

    this.firstObservable$.pipe(
      filter(Boolean),
      // be carefull here and instead switchMapTo use lazy alternative - switchMap
      switchMap(() => this.secondObservable$) 
    );
    

    【讨论】:

    • 这仅适用于第一个发射,直到第二个 Observable 触发。那么过滤器只会避免再次发射 firstObservable。
    • 不,没有像 takefirsttakeUntil 这样的取消子运算符。所以我看不出它在第一次发射后不能工作的任何原因。这个过滤器只是帮助我们避免来自外部(第一个)可观察的错误值,这是我们想要的行为。如果外部 obs 以 true 触发 -> 我们从 prev 内部 observable 取消订阅并创建新的订阅
    • 也许我在这里理解错了要求。我认为@KingKongFrog 希望避免在第一个发出 false 时发出第二个 observable。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多