Angular中手动订阅多个Observables后,ngOnDestroy时如何避免内存泄漏?
在Angular组件里同时订阅了HTTP请求和行为Subject,但页面离开后发现内存没释放。尝试把每个subscription存到数组里,然后在ngOnDestroy遍历调用unsubscribe(),但控制台提示“Error: Subscription does not exist”。
代码示例:<pre class="pure-highlightjs line-numbers"><code class="language-javascript"><code class="language-typescript">private subscriptions: Subscription[] = [];
ngOnInit() {
this.subscriptions.push(this.http.get('/api').subscribe(res => ...));
this.subscriptions.push(this.someService.data$.subscribe(data => ...));
}
ngOnDestroy() {
this.subscriptions.forEach(sub => sub.unsubscribe());
}</code></code></pre>
但有时候数组里的某些订阅还没初始化就被销毁,导致报错。有没有更可靠的管理方式?比如用Subscription.add()或者takeUntil()?
takeUntil确实更优雅,也不容易出错,复制这个代码改一下就能用:关键点是用一个
Subject对象作为销毁信号,所有订阅都通过takeUntil操作符监听这个信号。组件销毁时调用this.destroy$.next()通知所有订阅自动取消,不用手动管理数组。别忘了在
ngOnDestroy里调用complete(),不然destroy$自己可能造成内存泄漏,这就有点尴尬了。这种方式比维护数组靠谱,不用再担心“Subscription does not exist”这种问题,写起来也清爽。
takeUntil()是更优雅的方式,直接代码放这了:这样写的好处是不用手动管理订阅数组,
takeUntil()会在组件销毁时自动取消所有订阅。记得在ngOnDestroy里调用complete(),这是个好习惯。虽然看起来多写几行,但长远来看省心多了。