我正在尝试检测并修复我的angular/spartacus应用程序中潜在的内存泄漏。所以基本上我在寻找任何";在我的代码库中订阅(…"调用并评估我能做什么。
我知道最简单的形式就是直接在html中使用observable,并通过使用异步管道读取它们,而不是调用subscribe方法并将值分配给组件类属性。但有时事情并没有那么简单。有时,观测数据必须以某种方式准备。
我的问题是,这些方法是否同样有效
-
分配ANY"是个好主意吗;subscribe(("调用Subscription对象,我最终将在";ngOnDestroy"-方法
-
为什么我不能使用Subscription对象调用来代替"订阅"对象;取消订阅"-方法紧接在";订阅";呼叫
-
最重要的是:使用";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块中正确取消订阅。这两种方式都是有效的,可能只是的偏好问题