То, чего я хочу достичь, очень похоже на то, что описано здесь: 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
. Любой из них подойдет для моего требования.
Предложения?