RxJS не генерирует ошибку при отображении, даже если наблюдаемая ошибка генерирует ошибку - PullRequest
1 голос
/ 09 мая 2019

У меня есть сетевой вызов, где, скорее всего, 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 ниже

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 Ответ

2 голосов
/ 09 мая 2019

Вы можете сделать это с map и catchError .

catchError перехватит любую ошибку, выданную источником, и вернет aНовая наблюдаемая.Этот новый 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')),
    );
  }
...