【发布时间】:2017-05-31 16:15:49
【问题描述】:
我在我的 Angular 组件中遵循如下所示的清理模式:
class SomeComponent implements OnInit, OnDestroy {
private destroy$ = new Subject();
ngOnInit() {
service.someStream().takeUntil(this.destroy$).subscribe(doSomething);
}
ngOnDestroy() {
this.destroy$.next(true);
}
}
这样做的好处是在组件被销毁时自动取消订阅。
我的问题是:对 destroy$ 的引用是否会因为我没有调用 this.destroy$.complete() 而无限期地存在,还是会在收集父类时被 GC 处理?
【问题讨论】:
-
即使您没有直接在主题上调用
complete(),您也可以使用takeUntil运算符完成链,该运算符发送complete信号并使每个运算符递归地取消订阅。因此,complete信号是来自主题还是更下游的某个地方并不重要。 -
@martin 我认为您的回答不正确。对我来说,takeUntil 将完成您应用 takeUntil 的流。不是用于 takeUntil 的那个。看一下弹珠图:reactivex.io/rxjs/class/es6/… 请注意,当发出
z时,最终流是关闭的,但包含z的流仍然是打开的。所以肖恩,是的,你需要调用下一个,也是完整的。 -
虽然我很确定当对父类的引用被删除时它会被 GC 处理。这种模式对我来说似乎很可疑,为什么你不简单地跟踪订阅并在关闭所有流时调用
unsubscribe? -
@paulpdaniels 如果您有多个订阅,则必须保留对每个订阅的引用并按顺序调用取消订阅。通过使用上面的模式,您可以拥有一个一次性取消订阅它们的主题。结果代码更少,可读性更高。
-
OP是关于垃圾收集
subject,为什么cmets讨论如何垃圾收集subscriptions?