【发布时间】:2020-04-26 10:50:57
【问题描述】:
假设我有一个Observable(热门,未完成),我订阅了它。通常当我完成Subscription 后,我必须取消订阅它以防止内存泄漏。
let subject$ = new Subject();
const sub = subject$.subscribe(...);
...
// Need to call sub.unsubscribe() when we are finished
sub.unsubscribe();
sub = null;
但是,如果我不仅完成了 Subscription,还完成了 Observable (Subject) 并且删除了对两者的所有引用,我是否需要调用 unsubscribe 方法?
let subject$ = new Subject();
const sub = subject$.subscribe(...);
...
sub = null;
subject$=null;
// Assume I have no other references to these
// Do I need to call sub.unsubscribe() in this case?
我的逻辑告诉我我不这样做,因为 Subject 和 Subscription 现在都符合垃圾收集条件,并且将被销毁,即使它们相互引用。还是有一些我不知道的隐藏参考?
不用担心使用unsubscribe、takeUntil或其他机制的区别。
【问题讨论】:
-
您好,您提出了一个有趣的问题。根据我的经验,总是建议取消订阅,但由于您设置了
subject$=null,这将确保不会发出其他排放,从而阻止再次调用订阅的回调函数的内存泄漏。顺便说一句,要完成一个主题,它有一个完整的方法(subject$.complete())。对您而言,由于subject$对您来说是本地的,然后您将其设置为 null,因此这不是问题。但是如果 observable 来自外部源,比如 redux 存储,那么它可能是一个问题,我会取消订阅。 -
另一件事是,如何退订。取消订阅的方法有很多,但我发现使用
async管道(如果使用 Angular)和takeUntil运算符是最干净的。 -
如果你能给出答案,最好有一些参考资料来支持它,那就太好了。 (不用担心“如何退订”部分)。
-
如果对主题和订阅“没有其他引用”,那么不,您不必取消订阅即可对其进行垃圾收集。仅当在 RxJS 中保存了对其中任何一个的引用时才需要取消订阅,但情况并非如此 - 除非您使用诸如
rxjs-spy之类的调试工具。
标签: javascript memory-leaks rxjs