【问题标题】:How to improve RxJS code to apply a function only for the first emission如何改进 RxJS 代码以仅将函数应用于第一次发射
【发布时间】:2020-10-28 20:43:35
【问题描述】:

我可以观察到每 N 秒发出一次值,而且我有。 我想进行第一次发射并在其上触发一个函数。

我有这个代码:

      sideEffect = false;
      observable$
      .pipe(
        tap((data) => {
          // executing this only for the first emission
          if (!sideEffect) {
            this.sideEffect(data.props);
            sideEffect = true;
          }
        })
      )
      .subscribe((data) => {
        // process all upcoming emissions
      });

有没有办法在不定义任何局部变量的情况下使用 RxJS 运算符使这段代码更好?

【问题讨论】:

标签: rxjs observable


【解决方案1】:

我将继续创建 2 个单独的 Observable,然后将它们合并,这样我们就可以拥有一个订阅。我认为这是通过 rxjs 实现此逻辑的最惯用的方式。

代码看起来像这样

const firstEmission$ = observable$
      .pipe(
        take(1),  // you can use also the first() operator which is the same as take(1)
        tap((data) => this.sideEffect(data.props))
      );
const otherEmissions$ = observable$
      .pipe(
        skip(1),
      );
merge(firstEmission$, otherEmissions$).subscribe((data) => {
        // process all upcoming emissions
      });

【讨论】:

  • 问题:你为什么需要merge他们?为什么你需要skip(1) in otherEmissions$? - 哦,是不是因为第一个来自firstEmission$,所以你只是mergeprocess them all 用例,对吧?
  • 哦,顺便说一句,您可能对此有任何想法stackoverflow.com/questions/64566051/…
  • @sreginogemoh merge 用于创建单个 observable,合并我们创建的两个 observable,因此只有一个订阅。如果您不合并它们,则需要单独订阅它们。 skip(1) is required to avoid that the merged Observable emits twice the first item emitted by observable$`.
【解决方案2】:

有一个scan 运算符可以解决你的问题:

const stream$ = from([1,2,3,4]).pipe(
  scan((firstValue, value) => {
    if (!firstValue) {
      firstValue = value;
      console.log('performing side effects for value: ', value);
    }
    return value;
  }, null),
  map(value => { /* your further logic here */ return value; })
);

scan 在每次发射时都会被调用,并将值存储在自身内部。它类似于数组中的reduce 函数。 另请注意,“虚假”值可能表现不正确(因为!firstValue 检查)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2021-11-22
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多