首页 > 解决方案 > 我是否需要完成一个仅用于组成另一个 Observable 的主题?

问题描述

嗨,我有以下组件:


export class PreviewReportComponent implements OnInit, OnChanges, OnDestroy {
  @Input() params: PreviewParams;
  reload$: Subject<void> = new Subject();
  preview$: Observable<SafeHtml>;
  constructor(private reportService: ReportService) {}

  ngOnInit() {
    this.preview$ = this.reload$.pipe(
      debounceTime(200),
      startWith([null]),
      switchMap(() => this.reportService.getPreview(this.params)),
    );
  }

  ngOnChanges() {
    this.reload$.next();
  }

  ngOnDestroy(){
    this.reload$.complete();
  }
}

我是否需要实现 OnDestroy 并在 reload$ 主题上调用完成?

我已经在使用 AsyncPipe 订阅 preview$ Observable。

标签: angularrxjs

解决方案


我是否需要实现 OnDestroy 并在 reload$ 主题上调用完成?

如果您担心的是内存泄漏,那么不,没有必要实施OnDestroy来完成您的主题,因为您没有订阅您的组件。当您的订阅在组件被销毁后保持打开状态时,就会发生内存泄漏。

由于您AsyncPipe用于处理订阅,因此您无需担心。


实际上,您甚至不需要OnInit

export class PreviewReportComponent implements OnChanges {
  @Input() params: PreviewParams;

  private reload$ = new Subject<void>();

  public preview$ = this.reload$.pipe(
    startWith([null]),
    debounceTime(200),
    switchMap(() => this.reportService.getPreview(this.params)),
  );

  constructor(private reportService: ReportService) {}

  ngOnChanges() {
    this.reload$.next();
  }

}

OnChanges如果您将参数更改为设置器,您也可以摆脱它:

export class PreviewReportComponent {
  private params$ = new Subject<PreviewParams>();

  @Input() set params(params: PreviewParams) {
    this.params$.next(params);
  }

  public preview$ = this.params$.pipe(
    startWith([null]),
    debounceTime(200),
    switchMap(params => this.reportService.getPreview(params)),
  );

  constructor(private reportService: ReportService) {}
}

推荐阅读