最近,我碰到了一些解释可观察性的文章,因为我是Angular的新手,所以我一直在尝试找出做所有事情的最佳方法。
我碰到了这篇文章:https://blog.angularindepth.com/angular-question-rxjs-subscribe-vs-async-pipe-in-component-templates-c956c8c0c794,其中介绍了订阅与异步管道。
但是,即使在研究了这篇文章以及诸如此类的是否订阅之后,我仍然很难获得确切的答案。
因此,我知道您对服务的订阅可能会泄漏,并且根据this article,如果您要使用subscribe()
,则应该在unsubscribe()
期间ngOnDestroy()
。
否则会发生:
订阅永远不会取消订阅,因此,如果Observable不能单独完成,则整个组件及其模板及其所有关联对象将永远存在于内存中。
但是我也看到有时人们说您在组件中调用服务时不需要显式取消订阅,因为Angular会为您服务吗?也许我很困惑,但是我只想得到一个确定的答案,所以我知道使用subscribe()
时要实现什么,这样内存泄漏就不会成为问题。
所以我需要从unsubscribe()
中的service
中显式component
来吗?如果可能的话,一种解释也将对未来的人们有所帮助。谢谢!
答案 0 :(得分:2)
Angular仅照顾从Http服务或使用异步管道返回的内置可观察订阅的退订,但是您需要显式取消订阅自定义可观察对象。
您可以使用异步管道,以便可观察的取消订阅事件由Angular处理,或者有另一种使用takeUntil的方式
请参考本文以获得对takeUntil的更好解释-RxJS: Don’t Unsubscribe
也可以考虑阅读本文,以避免takeUntil泄漏-RxJS: Avoiding takeUntil Leaks
答案 1 :(得分:0)
您必须了解可观察和观察者流。也许以下几点对您有帮助:
如果观察者完成,则不必取消订阅:observer.complete()或observer.error(),因为错误也使观察者完成。这意味着您可以编写:
Observable.create((observer) => {
observer.next(true)
observer.complete();
});
您不必取消订阅http请求。 (它也已完成)。
您必须取消订阅路由器事件
您必须退订(未完成)计时事件
查看本文以获取有关此主题的更多信息:https://netbasal.com/when-to-unsubscribe-in-angular-d61c6b21bad3
要检查代码,可以使用chrome性能分析devtools。查看事件监听器。