为什么第二个switchMap在订阅时执行数百次



这是再现问题的最小代码:

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();

演示

我希望只记录一个号码。不是几百。

如果你做了以下任何一件事,问题就会消失:

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

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

您的代码似乎按预期工作。在这段代码中,你每次使用都会回放可观察到的内容,这正是shareReplay所做的。使用你的两个switchMap运算符,它会进入无限回放工作,并因为彼此而陷入地狱。

原因是您的第一个switchMap操作符没有端点,比如take(1)或类似的东西。

如果你认为缓冲区大小在这里起作用,那就错了。Buffer只适用于多个订阅,在这种情况下不能用于多个可观察的使用。

最新更新