由于ngOnInit在应用程序的生命中只调用一次,因此当我在ngOnInit中订阅可观察对象时,是否仍需要取消订阅?
关闭应用程序/选项卡后,应用程序是否可能为浏览器创建内存泄漏?
简短的答案是:
1( 始终
2( 是
这篇文章很好地描述了为什么我们应该取消订阅所有可观察性,以及如何以有效的方式从角度进行订阅。
如果您正在订阅ngOnInit
功能,则应通过ngOnDestroy
取消订阅。
我通常创建一个unsubscribe
主题,并在ngOnDestroy
上调用它的next()
。我会用takeUntil(unsubscribe)
订阅所有内容。
这就是我的意思:
unsubscribe = new Subject();
(...)
subscribeTo() {
this.myService.getAll().pipe(
takeUntil(this.unsubscribe),
).subscribe(data => this.localData = data);
}
ngOnDestroy() {
this.unsubscribe.next();
this.unsubscribe.complete();
}
我的回答是肯定的。
如果这种情况在OnInit
生命周期中只发生一次,那么使用take(1)
就足够了。
示例:
ngOnInit() {
this.observableData$ = this.myService.getAll().pipe(take(1));
}
好处是:
- 无
unsubscribe
- 无
ngOnDestroy
- 更少的代码,更少的bug
但是,我在本文中建议您使用另一种通过反应式编程处理数据的方法。因为subscribe
获取数据是不对的。我们只是使用subscribe
来回调另一个东西(而不是数据(。
我个人从未订阅过。请使用异步管道为我管理订阅。
data$ = this.service.getData();
并且在模板中
<ng-conatainer *ngIf="data$ | async as data">
{{ data | json }}
</ng-conatainer>
无需任何订阅。