RxJS не выдает ошибку при отображении, даже если базовый наблюдаемый выдает ошибку

У меня есть сетевой вызов, при котором вероятно, что 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, весь наблюдаемый объект переходит в режим ошибки.

Я хочу предотвратить это, потому что этот вызов 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));

person Siddhant Swami    schedule 09.05.2019    source источник


Ответы (1)


Это можно сделать с помощью map и catchError.

catchError перехватит любую ошибку, выданную источником, и вернет новый объект Observable. Этот новый Observable - это то, что в вашем случае будет передано forkJoin в случае ошибки HTTP.

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')),
    );
  }
person Will Taylor    schedule 09.05.2019