这是再现问题的最小代码:
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只适用于多个订阅,在这种情况下不能用于多个可观察的使用。