gpt4 book ai didi

angular - 我应该取消订阅根 Angular 组件中的可观察对象吗?

转载 作者:行者123 更新时间:2023-12-02 12:14:00 25 4
gpt4 key购买 nike

我的根(引导)Angular (6.x) 组件中有一个 Observable,AppComponent
通常,我会使用生命周期钩子(Hook) ngOnDestroy 在 destroy() 调用时取消订阅任何打开的订阅。
由于 AppComponent 是应用程序的根,因此永远不会被销毁(除非整个应用程序被销毁),我是否仍然需要实现 ngOnDestroy 并且是否需要费心取消订阅?

我一直无法找到这个看似常见且确切的场景的答案。

示例:

export class AppComponent implements OnInit, OnDestroy {
private tokenSubscription: Subscription;
constructor(private dataSvc: DataService) { }
ngOnInit() {
this.tokenSubscription = this.dataSvc.myObservable.subscribe((val) => {
// do stuff
});
}
ngOnDestroy() {
this.tokenSubscription.unsubscribe(); // Do I need this in root component?
}
}

谢谢!

最佳答案

AppComponent.ngOnInit() 中的一次性订阅是可以的

Angular AppComponent 中的 RXJS 订阅不需要取消订阅,只要不重复创建新的订阅即可。例如,如果订阅是在 AppComponentngOnInit 中创建的,只要它们是一次性操作,就可以了。

根中提供的 Angular 服务理想情况下应为 Singleton Services

对于在根组件中创建的 Angular 服务,最好使用单例服务来确保应用程序中仅存在一个实例。

最佳实践

虽然根组件中存在未取消订阅的订阅通常是可以的,但建议遵循管理订阅的最佳实践。

  • take(1) - 对于在应用程序启动期间仅发生一次的订阅,请使用 RXJS take(1) 运算符,其优点是自动取消订阅。
  • async Pipe - 在幕后处理 RXJS 订阅并自动取消订阅。

使用take(1)的示例

constructor(private dataSvc: DataService) { }

ngOnInit() {
this.dataSvc.myObservable.pipe(take(1)).subscribe((val) => {
// do stuff
});
}

参见The Best Way To Unsubscribe RxJS Observables In The Angular Applications!

关于angular - 我应该取消订阅根 Angular 组件中的可观察对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58275496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com