CombineLatest продолжается даже в случае сбоя и уже имеет канал для catchError - PullRequest
0 голосов
/ 07 апреля 2020

То, чего я хочу достичь, очень похоже на то, что описано здесь: Observable.combineLatest продолжится, даже если произойдет сбой

Основным отличием является то, что в моем сервисе уже есть компонент для обрабатывать запросы об ошибках, которые возвращают throwError.

Служба:

get(): Observable<Array<MyObject>> {
    return this.client.get<Array<MyObject>>('/api').pipe(
      map(response => this.flattenMyObject(response)),
      catchError(ServiceHandler.error)
    );
  }

Оба вызова аналогичны приведенным выше, только разные конечные точки

ServiceHandler:

export namespace ServiceHandler {
  export function error(err: HttpErrorResponse) {
    if (err.error instanceof ErrorEvent) {
      // A client-side or network error occurred. Handle it accordingly.
      console.error('An error occurred:', err.error.message);
    } else {
      // The backend returned an unsuccessful response code.
      // The response body may contain clues as to what went wrong,
      console.error(
        `Backend returned code ${err.status}, ` + `body was: ${err.error}`
      );
    }
    // return an observable with a user-facing error message
    return throwError('Something bad happened; please try again later.');
  }
}

И Компонент:

    const observable1$ = this.myService.get()
      .pipe(take(1));
    const observable2$ = this.myService.getOther().pipe(take(1));

    const result$ = zip(observable1$, observable2$).pipe(
      map(([list1, list2]) => {
        let concatenedList = [];

        const hasList1 = !!list1 && list1.length > 0;
        const hasList2 = !!list2 && list2.length > 0;

        if (hasList1) {
          concatenedList = concatenedList.concat(list1);
        }

        if (hasList2) {
          concatenedList = concatenedRulesList.concat(list2);
        }

        return concatenedList;
      })
    );
    this.gridData$ = result$;
  }

Проблема заключается в том, что при сбое одного из вызовов первый будет отменен и ничего не будет возвращено. Если в моей службе я изменяю catchError на: catchError(() => of(null)), то при сбое одного из вызовов выход не изменяется и результаты успешного вызова загружаются в мою переменную класса gridData$.

. такое же поведение происходит, если я использую .zip, .forkjoin или .combineLatest. Любой из них подойдет для моего требования.

Предложения?

1 Ответ

0 голосов
/ 08 апреля 2020

Что я понимаю, вы хотите, чтобы код продолжал регистрировать ошибку, как будто ошибки нет? ваш сервис уже обрабатывает ошибку, а затем пересылает ошибку, после чего ваш компонент может перехватить перенаправленную ошибку, игнорировать ее, а также выдать и пустой список, все должно работать так, как ожидается, так как вы игнорируете выданную ошибку, я также используйте объединениеПоследнего для этого сценария, если только вы не строго придерживаетесь последовательности выданных значений

   const observable1$ = this.myService.get()
                  .pipe(
                        take(1),
                        catchError(_ => of([]))
                   );

    const observable2$ = this.myService.getOther()
                  .pipe(
                        take(1),
                        catchError(_ => of([]))
                  );



 this.gridData$ = combineLatest(observable1$, observable2$)
                  .pipe(
                        map(([list1, list2]) => [...list1,...list2])
                   );
...