作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
想象一下,我在 ngOnInit()
中写了一个可观察的表达式像这样的钩子(Hook):
ngOnInint(){
this.httpClient.get('request-url').subscribe(response => {
...
})
}
在
ngOnInit
之后如果未将函数的上下文保存到变量中,则执行该函数的上下文可能会被破坏。但即使 observable 仍然由任何值发出处理。
最佳答案
即使没有变量,实际上也会创建订阅,并且浏览器会为其分配内存。当然,订阅是引用可观察/主题。即使组件从页面中删除,订阅仍然存在并导致内存泄漏,因为 garbage collector不会删除它。这就是 javascript 的工作方式,它不是 Angular 或 rxjs 的问题。
GC算法根据各种条件决定删除对象。例如,如果此对象对其他资源的引用为零,并且没有其他对象对这个对象的引用。
这就是为什么当你不再需要订阅时你应该取消订阅 observables。在引擎盖下,当您调用 unsubscribe
时, Rxjs 清理了 observable 引用,这会导致两件事:不再处理进一步的值发出,并且 GC 将能够在最近的时间释放内存。
在 Angular 中,最佳实践是在 ngOnDestroy
中执行此操作。 :
ngOnInit() {
this.subscription = this.httpClient.get('request-url').subscribe(...)
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
当然,为了做到这一点,您需要将订阅分配给一个变量,因为否则您将无法调用
unsubscribe
方法。
关于javascript - Angular 如何存储未链接到变量的可观察对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68354596/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!