Memory leaks RxJS:在takeUntil之后使用repeat创建订阅泄漏

Memory leaks RxJS:在takeUntil之后使用repeat创建订阅泄漏,memory-leaks,rxjs,Memory Leaks,Rxjs,我有以下场景:我想订阅source1,当它在至少2000ms内不发射任何东西时,我想从回退发射。但是,当source1再次发出时,我想切换回source1等等 我有一个可以工作的实现,但是它会造成订阅泄漏,因为repeat在takeUntil之后使用。本文对此进行了详细解释。我不知道如何在保持相同行为的同时消除泄漏。有办法吗 const source1: Observable; const fallback: Observable; const b = source2.pipe(takeUnt

我有以下场景:我想订阅
source1
,当它在至少2000ms内不发射任何东西时,我想从
回退发射。但是,当
source1
再次发出时,我想切换回
source1
等等

我有一个可以工作的实现,但是它会造成订阅泄漏,因为
repeat
takeUntil
之后使用。本文对此进行了详细解释。我不知道如何在保持相同行为的同时消除泄漏。有办法吗

const source1: Observable;
const fallback: Observable;

const b = source2.pipe(takeUntil(source1));
const a = source1.pipe(timeoutWith(2000, b), repeat());

a.subscribe(console.log)

你可以玩一下这个简单的复制案例

我之前的回答不起作用,你说得很对。不过,我认为这确实起到了作用:

source1.pipe(
switchMap(val=>merge(of(val),source2.pipe(delay(2000)))
).subscribe(console.log);

重复
操作员将保持订阅运行,直到
取消订阅
。在您的示例中,当订阅即使在取消订阅后仍保持运行时,也会发生内存泄漏。我确实尝试取消订阅,但订阅被取消[示例-我在20秒后取消订阅]。内存泄漏的含义是什么?@user2216584在我的示例中,每次重复该行为时,都会创建一个新的订阅。你可以在我链接的那篇文章中读到更多关于它的信息。没有,我想要一个发出形式为
source1
的可观察对象,如果
source1
停止发出至少2秒,它将切换到
回退
,直到
source1
再次发出。依此类推,不是真的,最终的
可观察的
,你订阅的那个应该发出这些值。如果我从您的示例中删除
点击
,并执行
.subscribe(console.log)
,您可以看到发出的值是不正确的。太棒了,这个版本正是我想要的。不过,我刚刚发现了一个边缘案例,这只有在
source1
发出至少一个值后才开始工作。因此,如果我订阅了这个可观察对象,并且在2秒后,
source1
没有发出,那么当然,最终的可观察对象不会发出任何值。我看不到一个简单的方法来修复它…你可以添加一个带有伪值的
startWith
,你可以测试它。那样的话,你肯定会得到一个发射。或者你有
source1
成为
BehaviorSubject