代码之家  ›  专栏  ›  技术社区  ›  Renaud is Not Bill Gates

subscribe中的代码被多次执行

  •  0
  • Renaud is Not Bill Gates  · 技术社区  · 5 年前

    我在我的项目中使用了ng zorro组件,我想展示一个调用服务来删除条目的模型,这是我如何定义delete confirm对话框的:

      showDeleteConfirm(id: string): void{
        this.modal.confirm({
          nzTitle: 'Êtes-vous sûr de vouloir supprimer ce enregistrement ?',
          nzOnOk: () => {
              this.service.delete(id).subscribe(data => {
              this.notification.create("success", "Suppression", "L'enregistrement a été supprimée !");
            });
          }
        });
      }
    

    但是我遇到了这样的问题:subscribe函数中的代码被多次执行。

    我该怎么解决?

    这是我的删除功能:

    delete(id: string): any{
      return this.http.delete<Entity>(this._apiURL + id, this.httpOptions).pipe(
        catchError(this.handleError)
      );
    }
    private handleError(err: HttpErrorResponse) {
      let errorMessage = '';
      if (err.error instanceof ErrorEvent) {
        errorMessage = `An error occurred: ${err.error.message}`;
      } else {
        errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
      }
      return errorMessage;
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Samuel Ayvazyan    5 年前

    如果您想确保subscribe中的代码执行一次,可以使用 take(1) first()

    this.service.take(1).subscribe(...);
    

    而且,最好的做法是 takeUntil() 例如在 ngOnDestroy

    class myComponent {
      private destroyed$: ReplaySubject<boolean> = new ReplaySubject(1);
    
      constructor(
        private service: Service) {}
    
      ngOnInit() {
        this.service
          .takeUntil(this.destroyed$)
          .subscribe(...);
      }
    
      ngOnDestroy() {
        this.destroyed$.next(true);
        this.destroyed$.complete();
      }
    }