【问题标题】:How to implement error handling in Angular and RXJS如何在 Angular 和 RXJS 中实现错误处理
【发布时间】:2022-01-06 09:32:58
【问题描述】:

我想使用订阅在用例方法中执行错误处理。如果在适配器中抛出错误,则应在用例中执行处理。不幸的是,catch 不适用于下面的示例,只会抛出来自适配器的错误。

  public checkInUsecase(): void {
    this.checkInAdapter().subscribe(
      (data) => {
        this.logger.debug('Work...');
      },
      (error) => {
        this.logger.error('Error.');
      },
      () => {
        this.logger.debug('Successful.');
      }
    );
  }

  public checkInAdapter(): Observable<boolean> {
    throw new Error('Check in error');
  }

【问题讨论】:

标签: javascript angular typescript rxjs


【解决方案1】:

在可观察对象中抛出错误。在您的示例中,该函数未返回可观察对象。

public checkInUsecase(): void {
    this.checkInAdapter()
        .pipe(catchError(err) => {
            this.logger.error('Error.');
            throw EMPTY;
        })
        .subscribe((data) => {
            this.logger.debug('Work...');
        });
}

public checkInAdapter(): Observable < boolean > { // this method needs to return an observable
    return new Observable((subscriber) => {
        if (!isAllGood) {
            throw Error('error message'); // error is thrown inside the observable.
        }
    });
}

【讨论】:

  • 当返回的 observable 来自另一个方法并且错误不是在返回的 observable 中抛出时,它是如何工作的,如下所示。 ` public checkInAdapter(): Observable { if(!isAllGood) { throw Error('error message'); } 返回 api.checkin(); } `
  • 如果我理解你是正确的,你的错误甚至在你到达'return api.Checkin()'之前就被抛出,在这种情况下它不是一个可观察到的错误,因为观察者甚至没有被订阅到还。你可以想象甚至在调用 thishis.checkInAdapter() 之前就会抛出错误
  • 只有repsonse之后甚至订阅之前才知道error,这两种情况会有完全不同的code。
【解决方案2】:

Angular 中有一个特殊的管道,可以让你捕捉 Observable 中的错误并做出相应的反应。

public checkInUsecase(): void {
  this.checkInAdapter()
    .pipe(catchError(err) => {
        this.logger.error('Error.');
        throw EMPTY;
    })
    .subscribe((data) => {
        this.logger.debug('Work...');
    });
}

public checkInAdapter(): Observable<boolean> {
  throw new Error('Check in error');
}

【讨论】:

  • 这对我不起作用。
  • 当 checkInAdapter 永远不会返回 observable 时,这种情况是否有意义?
  • @laprof 那是因为你没有正确抛出错误。 catchError 管道不是问题。我只是向您展示伪代码以显示处理错误的正确方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2020-10-15
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多