我应该在 angular ngOnDestroy 之后完成我的主题吗
Should I be completing my subject after nexted in angular ngOnDestroy
当我需要手动订阅组件中的流时,我通常使用 takeUntil(this.destroySub)
。我是否在 ngOnDestroy
?
中完成主题(对于主题(垃圾收集或诸如此类)- 因为 nexting 足以完成流)是否重要
@Component({...})
class MyComponent {
private destroySub = new Subject<void>();
constructor() {
of('some stream').pipe(
takeUntil(this.destroySub)
).subscribe()
}
ngOnDestroy():void {
this.destroySub.next();
this.destroySub.complete();
}
}
简答。
takeUntil(this.destroySub)
是您完成组件中所有 other 可观察对象的方式,但这并没有完成 this.destroySub
本身。
是的,主题没有有限的生命周期,因此您应该在不再需要它们时完成它们。
较长的答案
就像任何其他对象一样,一旦没有更多指针指向它,GC 仍将收集 Subject
。这种思维方式的问题在于很容易意外泄露对该主题的引用。因为它是一个异步库,引用可以同时在当前堆栈和事件循环中。
您在一个框架内工作,该框架可能会尝试优化您的组件,因此不能保证在调用 ngOnDestroy 后将对您组件的引用放在 Angular 内。每次使用 takeUntil(this.destroySub)
时,您还会传递对 RxJS 库的引用。在许多情况下,RxJS 会为您代理和管理排放,因此您可能会对导致内存泄漏的相对普通的代码行感到惊讶。
完成一个 observable 会清除 RxJS 为任何给定的 observable 保留的所有内部检测,并在这方面让你的意识清晰。
所以是的,即使(如果您小心且消息灵通)GC 可能会清理不完整的可观察对象,我也不会指望它。如果您的可观察对象不是有限的,则以某种方式使其有限。 this.destroySub.complete();
对你有用吗。
当我需要手动订阅组件中的流时,我通常使用 takeUntil(this.destroySub)
。我是否在 ngOnDestroy
?
@Component({...})
class MyComponent {
private destroySub = new Subject<void>();
constructor() {
of('some stream').pipe(
takeUntil(this.destroySub)
).subscribe()
}
ngOnDestroy():void {
this.destroySub.next();
this.destroySub.complete();
}
}
简答。
takeUntil(this.destroySub)
是您完成组件中所有 other 可观察对象的方式,但这并没有完成 this.destroySub
本身。
是的,主题没有有限的生命周期,因此您应该在不再需要它们时完成它们。
较长的答案
就像任何其他对象一样,一旦没有更多指针指向它,GC 仍将收集 Subject
。这种思维方式的问题在于很容易意外泄露对该主题的引用。因为它是一个异步库,引用可以同时在当前堆栈和事件循环中。
您在一个框架内工作,该框架可能会尝试优化您的组件,因此不能保证在调用 ngOnDestroy 后将对您组件的引用放在 Angular 内。每次使用 takeUntil(this.destroySub)
时,您还会传递对 RxJS 库的引用。在许多情况下,RxJS 会为您代理和管理排放,因此您可能会对导致内存泄漏的相对普通的代码行感到惊讶。
完成一个 observable 会清除 RxJS 为任何给定的 observable 保留的所有内部检测,并在这方面让你的意识清晰。
所以是的,即使(如果您小心且消息灵通)GC 可能会清理不完整的可观察对象,我也不会指望它。如果您的可观察对象不是有限的,则以某种方式使其有限。 this.destroySub.complete();
对你有用吗。