gpt4 book ai didi

javascript - Angular 如何存储未链接到变量的可观察对象?

转载 作者:行者123 更新时间:2023-12-04 12:21:56 25 4
gpt4 key购买 nike

想象一下,我在 ngOnInit() 中写了一个可观察的表达式像这样的钩子(Hook):

ngOnInint(){
this.httpClient.get('request-url').subscribe(response => {
...
})
}
ngOnInit 之后如果未将函数的上下文保存到变量中,则执行该函数的上下文可能会被破坏。但即使 observable 仍然由任何值发出处理。
问题是:如果未将其保存到变量中, Angular 将在何处以及如何跟踪可观察对象?

最佳答案

即使没有变量,实际上也会创建订阅,并且浏览器会为其分配内存。当然,订阅是引用可观察/主题。即使组件从页面中删除,订阅仍然存在并导致内存泄漏,因为 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/

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