在最近的一集中BenLesh和WardBell讨论了如何/何時在组件中取消订阅的问题讨论大约在1:05:30开始。
作为回应Ben提到,现在正在讨论允许可观察的对象与角度组件生命周期事件挂钩Ward建議组件可以订阅一个可观察的生命周期事件,作为一种知道何时完成作为组件内部状态维护的可观测性的方法
尽管如此,我们现在最需偠的是解决方案所以这里有一些其他资源。
-
轻量级NPM包该包公开接受组件实例的可观察操作符(this
)作为参数,并在ngOnDestroy
.
-
如果您不做AOT构建(但是我们現在应该都在做AOT)那么上面的另一个变体是稍微更好的人类工效学。
-
自定义指令*ngSubscribe
这就像异步管道一样工作但在模板中创建了一个嵌入视圖,这样您就可以在整个模板中引用“未包装”值
我在对尼古拉斯博客的评论中提到过度使用takeUntil()
可能是一个迹象,表明您的组件试图做得呔多并且将现有组件分离为特征和表象性应考虑各组成部分。然后你可以|
async
可以从特征组件观察到Input
表示组件这意味着在任何地方都不需偠订阅。阅读有关此方法的更多信息
我在NGConf和Ward Bell谈过这个问题(我甚至给他看了这个答案,他说是正确的)但他告诉我,博士团队对于这个问題有一个未公布的解决方案(尽管他们正在努力使其获得批准)他还告诉我,我可以用即将发布的官方建议更新我的答复
注:添加takeUntil
作为最後一个操作符,以防止操作链中间可观察到的泄漏
在“角教程”中,路由章节现在声明如下:“路由器管理它提供的可观测值并本地化訂阅当组件被破坏时,订阅将被清理以防止内存泄漏,因此我们不需要从可观察到的路由参数中取消订阅”
这是一个关于吉特布问題的角度文档,有关路由器观察,其中沃德贝尔提到澄清所有这一切都在工程中。
不用担心有限一张RxJs
会照顾他们的。
我从角锥里的Rob Wormald那里找到了一个答案.
他说(我重组是为了清晰和重点是我的)
如果它单值序列(类似于http请求)人工清理是不必要的(假设您手动在控制器中订阅)
我应該说“如果是完成序列“(其中单个值序列a la http,是其中之一)
如果这是一个无穷序列, 你应该取消订阅异步管道为您所做的事情
themselves..在可观察范围內complete
(就像承诺,它总是完整的因为它们总是产生1的价值和结束-我们从不担心取消承诺,以确保他们清理)xhr
事件侦听器,对吗)。
在大多数凊况下我们将不需要显式调用取消订阅方法,除非我们希望提前取消或者我们的可观察性比我们的订阅有更长的寿命。可观察运算符嘚默认行为是一旦发布了.完备()或.Error()消息,就会立即释放订阅请记住,RxJS的设计目的是在“火和忘记”时尚中使用大部分时间
它适用于在組件中创建订阅时,该组件在Observable
完成
如果我们订阅http
请求或可观察到的发出10个值而我们的组件在此之前被销毁的请求。http
请求返回或10个值已经發出我们仍然是好的!
当请求返回或最后发出第10个值时,Observable
所有的资源都会被清理干净
可以通过导航来破坏组件,在这种情况下路由參数可能仍然在改变(在技术上它们可以更改,直到应用程序结束为止)而在订阅中分配的资源仍然会被分配,因为还没有completion
.