避免angular内存泄漏的最佳实践



我正在尝试检测并修复我的angular/spartacus应用程序中潜在的内存泄漏。所以基本上我在寻找任何";在我的代码库中订阅(…"调用并评估我能做什么。

我知道最简单的形式就是直接在html中使用observable,并通过使用异步管道读取它们,而不是调用subscribe方法并将值分配给组件类属性。但有时事情并没有那么简单。有时,观测数据必须以某种方式准备。

我的问题是,这些方法是否同样有效

  1. 分配ANY"是个好主意吗;subscribe(("调用Subscription对象,我最终将在";ngOnDestroy&quot-方法

  2. 为什么我不能使用Subscription对象调用来代替"订阅"对象;取消订阅"-方法紧接在";订阅";呼叫

  3. 最重要的是:使用";pipe((";操作员,以接收数据,用SwitchMap对其进行操作,然后将其返回到";obs$"-对象,我可以通过异步管道在html中读取。是否有任何隐藏的订阅与";管道(…("-我必须手动取消订阅的过程,或者与显式订阅然后将观察到的对象分配给组件类属性相比,这确实总是更可取的方法吗?

示例:而不是这个

mergedReferences$: Observable<Observable<Product>[]>;
subscription = new Subscription();
ngOnInit() {
this.subscription.add(this.cart$.subscribe(c => {
if (c.code) {
this.mergedReferences$ = this.getMergedProducts(c.code);
}
}));
}
ngOnDestroy(): void {
this.subscription?.unsubscribe();
}

简单地做这个

mergedReferences$: Observable<Observable<Product>[]>;

ngOnInit() {
this.mergedReferences$ = this.cart$.pipe(switchMap((c: Cart) => this.getMergedProducts(c.code!)))
}

您可以做的另一个选项是,您可以在任何subscribe((之前使用管道(take(1((运算符。这将在获取1个值后关闭订阅。这样的东西:

this.cart$.pipe(take(1)).subscribe(c => {
if (c.code) {
this.mergedReferences$ = this.getMergedProducts(c.code);
}
}));

但您的第一种方法也是处理订阅的有效方法。您在ngOnDestroy块中正确取消订阅。这两种方式都是有效的,可能只是的偏好问题

相关内容

  • 没有找到相关文章

最新更新