有没有什么时候我不需要在组件中处理取消订阅的例子?

cal*_*r47 4 rxjs angular-material2 angular

我已经习惯于取消订阅我在组件中初始化的订阅。推荐的方法是takeUntil像这样使用运算符:

killSubscriptions: new Subject<any> = new Subject();

ngOnInit(){
   observableThing().pipe(takeUntil(this.killSubscriptions)).subscribe()
}

ngOnDestroy(){
  this.killSubscriptions.next();
  this.killSubscriptions.complete();
}
Run Code Online (Sandbox Code Playgroud)

但是前几天我正在使用覆盖和门户服务实现一个自定义对话框,并且我在Angular Material Library中的一个方法中间遇到了这个代码块

// When the dialog backdrop is clicked, we want to close it.
if (config.hasBackdrop) {
  overlayRef.backdropClick().subscribe(() => {
    if (!dialogRef.disableClose) {
      dialogRef.close();
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

这个订阅是如何清理的?我唯一的猜测是在overlayRef处理时,订阅被清理。但是如何?

还有其他时候我们不需要处理取消订阅吗?

erh*_*ise 5

简答

因为当 OverlayRef 被认为进入处置状态时,它们完成了观察者。

this._backdropClick.complete();
Run Code Online (Sandbox Code Playgroud)

Angular Material CDK 源代码

希望这可以帮助!浏览源代码并试图理解它是一种很好且有趣的学习方式:)

编辑:如果您不确定您的观察者是否会完成,那么您需要确保您主动取消订阅以避免内存泄漏。你的 takeUntil 模式是一种方法。你甚至可以改变类型anyvoid拍摄对象。