使用 takeUntil 和 combineLatest 取消订阅可观察的 rxjs 不起作用

Posted

技术标签:

【中文标题】使用 takeUntil 和 combineLatest 取消订阅可观察的 rxjs 不起作用【英文标题】:Unsubscribing to rxjs observable using takeUntil and combineLatest not working 【发布时间】:2018-11-05 04:44:36 【问题描述】:

我正在使用accepted pattern 取消订阅我的订阅:

private ngUnsubscribe: Subject<void> = new Subject();

ngOnDestroy() 
    this.ngUnsubscribe.next();
    this.ngUnsubscribe.complete();

但是,我在使用 takeUntilcombineLatest 时遇到以下 rxjs 代码问题:

this.observableA$.pipe(
    takeUntil(this.ngUnsubscribe),
    combineLatest(
        this.observableB$,
        this.observableC$
    )
).subscribe(([A, B, C]) => 
    // do some work   
)

此订阅似乎持续存在,因为我可以看到在组件被销毁并重新初始化后多次触发代码。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您的内部 observableB 和 observableC 没有取消订阅。尝试重新排列运算符:

combineLatest(
    this.observableB$,
    this.observableC$
),
takeUntil(this.ngUnsubscribe)

【讨论】:

是的。最后返回的 observable 是最先订阅的,所以takeUntilpipe 中应该尽可能晚,在subscribe 链中应该尽可能早。 +1。 刚刚测试了交换运算符,它按预期工作!谢谢!

以上是关于使用 takeUntil 和 combineLatest 取消订阅可观察的 rxjs 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为 takeUntil 运算符提供的杀死 observable 的更好方法是啥,为啥?

Angular + RxJS:使用 takeUntil 与简单取消订阅?

RxJS 迁移 5 到 6 - 使用 TakeUntil 取消订阅

Angular RxJS Observable:takeUntil 与使用订阅取消订阅 [关闭]

撤消 takeUntil 对触发 rxjs 中另一个动作的影响

[RxJS] Stopping a Stream with TakeUntil