Javascript 没有引用句柄的订阅实例是否需要取消订阅?

Javascript 没有引用句柄的订阅实例是否需要取消订阅?,javascript,node.js,angular,typescript,rxjs,Javascript,Node.js,Angular,Typescript,Rxjs,只是想知道是否需要取消订阅未被引用的Subscription实例?例如,电话: 因此,每次某人登录订阅时,都会创建并返回一个实例,但没有句柄 IIUC这些将只是垃圾收集,但为了安全起见,我会仔细检查。如果可观察到的内容已完成,则无需取消订阅。使用http服务创建的可观察对象将在调用后完成 也就是说,最好还是取消订阅或加入takeUntil条款 finalise = new Subject<void>(); onSubmit(creds: Creds) { this.authSe

只是想知道是否需要取消订阅未被引用的
Subscription
实例?例如,电话:

因此,每次某人登录订阅时,都会创建并返回一个
实例,但没有句柄


IIUC这些将只是垃圾收集,但为了安全起见,我会仔细检查。

如果可观察到的内容已完成,则无需取消订阅。使用http服务创建的可观察对象将在调用后完成

也就是说,最好还是取消订阅或加入takeUntil条款

finalise = new Subject<void>();

onSubmit(creds: Creds) {
  this.authService.login(creds).pipe(takeUntil(finalise)).subscribe();
}

ngOnDestroy() {
  this.finalise.next();
  this.finalise.complete();
}
finalize=新主题();
onSubmit(creds:creds){
this.authService.login(creds).pipe(takeUntil(finalize)).subscribe();
}
恩贡德斯特罗(){
this.finalize.next();
这个。finalize。complete();
}

通过这种方式,您可以使用同一主题来完成您的所有观察对象,而不是管理许多订阅。

是的,这些需要在OnDestroy()方法中捕获并取消订阅。因此,如果我们不这样做,它会造成内存泄漏?是的,当然,它不需要取消订阅将完成的观察对象,但需要注意的是,它是在引用它的对象的生命周期中完成的。对于组件,这是在调用OnDestroy之前。不必完成观测。完成一个可观察对象并不能防止内存泄漏,但永远订阅一个从未完成的可观察对象会导致内存泄漏。因此,需要担心的是订阅者,而不是发射器(即可注入服务)。这样做的好处是,如果组件在完成之前被销毁,它将“取消”HTTP请求。@cgTag好提示!您不必将主题定义为布尔值。你可以把它作废<代码>最终确定=新主题()
然后
this.finalize.next()
。这基本上会发出一个未定义的值。还要确保takeUntil子句是管道中的最后一个函数,将map和filter等任何其他函数放在前面。它将适用于任何订阅,无论哪种类型的可观察对象。
finalise = new Subject<void>();

onSubmit(creds: Creds) {
  this.authService.login(creds).pipe(takeUntil(finalise)).subscribe();
}

ngOnDestroy() {
  this.finalise.next();
  this.finalise.complete();
}