使用 rxjs 和 Angular,是否有必要取消订阅在应用程序组件的 onInit 方法中仅发生一次的订阅?



由于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));
}

好处是:

  1. unsubscribe
  2. ngOnDestroy
  3. 更少的代码,更少的bug

但是,我在本文中建议您使用另一种通过反应式编程处理数据的方法。因为subscribe获取数据是不对的。我们只是使用subscribe来回调另一个东西(而不是数据(。

我个人从未订阅过。请使用异步管道为我管理订阅。

data$ = this.service.getData();

并且在模板中

<ng-conatainer *ngIf="data$ | async as data">
{{ data | json }}
</ng-conatainer>

无需任何订阅。

最新更新