【问题标题】:Why does the second switchMap execute hundreds of times on subscribe?为什么第二个 switchMap 在订阅时会执行数百次?
【发布时间】:2021-03-22 15:39:27
【问题描述】:

这是重现问题的最少代码:

import { defer, BehaviorSubject, of } from "rxjs";
import { shareReplay, switchMap } from "rxjs/operators";

const oneRandomNumber = defer(() => of(Math.floor(Math.random() * 20)));

const cache = { key: oneRandomNumber.pipe(shareReplay(1)) };

export const swr = () =>
  new BehaviorSubject(null).pipe(
    switchMap(() => cache.key),
    switchMap(number => {
      console.log(number); // WHY DOES THIS EXECUTE SO MANY TIMES?!
      return cache.key;
    })
  );

swr().subscribe();

demo

我希望只看到一个记录的数字。不是数百个。

如果您执行以下任何操作,问题就会消失:

  • 删除shareReplay(1)
  • 你不使用cache对象,直接使用oneRandomNumber.pipe(shareReplay(1))
  • 不要使用switchMap 两次

但我的最终代码需要所有这些东西。

【问题讨论】:

  • 我看到你的演示正在使用 rxjs 7.0-beta;切换到6.6.4 可以解决问题。
  • 嗯,你是对的。好的,我刚刚报告了错误并返回到版本 6。

标签: javascript rxjs


【解决方案1】:

您的代码似乎按预期工作。在这段代码中,您每次使用时都会重播 observable,这正是 shareReplay 所做的。并且与您的两个 switchMap 操作员一起,由于彼此,它会进入无限重播工作并坠入地狱。

原因 - 您的第一个 switchMap 运算符没有端点,例如 take(1) 或类似的东西。

如果你认为缓冲区大小在这里做任何工作,那就错了。 Buffer 仅适用于多个订阅,在这种情况下不适用于多个 observable 使用。

【讨论】:

  • 或者只是将你的 observable 与 ShareReplay 分开。
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 2019-06-18
  • 1970-01-01
  • 2019-03-23
  • 2019-10-17
  • 2019-01-21
  • 2019-08-10
  • 2021-03-17
相关资源
最近更新 更多