【问题标题】:RxJS do not throw error while mapping even when underlying observable throws error即使底层 observable 抛出错误,RxJS 也不会在映射时抛出错误
【发布时间】:2019-05-09 05:51:49
【问题描述】:

我有一个网络调用,其中 api 很可能会引发 400 错误。我想优雅地处理这件事。

现在我像下面那样做 -

   private fetchStatus(objectId: string): Observable<string> {
      return Observable.create((observer) => {
        this.http.get('/api/data-one').subscribe(response => {
          if (response.result === 'SUCCESS') {
              observer.next('SUCCESS');
          } else {
              observer.next('DENIED');
          }
          observer.complete();
        },
        error => {
          observer.next('DENIED');
          observer.complete();
        });
      });
  }

但我更喜欢使用 Observable.map 运算符。 Observable.map 的问题是当 api 抛出 400 时,整个 observable 进入错误模式。

我想防止这种情况发生,因为这个 get 调用正在与其他调用的 forkJoin 中使用。失败将意味着下面的整个 forkJoin 失败

forkJoin([
        this.http.get('/api/route-2'),
        this.http.get('/api/route-1'),
        this.fetchStatus('abc')
      ]).subscribe((responseCollection: any) => {
        observer.next({
          result1: responseCollection[0],
          result2: responseCollection[1],
          result3: responseCollection[2]
        });
        observer.complete();
      }, error => observer.error(error));

【问题讨论】:

    标签: rxjs rxjs6 rxjs-pipeable-operators


    【解决方案1】:

    您可以使用mapcatchError 执行此操作。

    catchError 将捕获源抛出的任何错误并返回一个新的 Observable。在您的情况下,这个新的 Observable 将在 HTTP 错误的情况下传递给 forkJoin

    private fetchStatus(objectId: string): Observable<string> {
    
        return this.http.get('/api/data-one').pipe(
            map(response => response.result === 'SUCCESS' ? 'SUCCESS' : 'DENIED'),
            catchError(error => of('DENIED')),
        );
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多