即使基础可观察到抛出错误,RxJS映射时也不会抛出错误

时间:2019-05-09 05:51:50

标签: rxjs rxjs6 rxjs-pipeable-operators

我有一个网络呼叫,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进入错误模式。

我想避免这种情况,因为在与其他调用的forkJoin中使用了此get调用。失败将意味着整个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));

1 个答案:

答案 0 :(得分:2)

您可以使用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')),
    );
  }