Чтобы гарантировать, что ошибка не завершает внешнее наблюдаемое, я использовал общий шаблон rx js эффектов :
public saySomething$: Observable<Action> = createEffect(() => {
return this.actions.pipe(
ofType<AppActions.SaySomething>(AppActions.SAY_SOMETHING),
// Switch to the result of the inner observable.
switchMap((action) => {
// This service could fail.
return this.service.saySomething(action.payload).pipe(
// Return `null` to keep the outer observable alive!
catchError((error) => {
// What can I do with error here?
return of(null);
})
)
}),
// The result could be null because something could go wrong.
tap((result: Result | null) => {
if (result) {
// Do something with the result!
}
}),
// Update the store state.
map((result: Result | null) => {
if (result) {
return new AppActions.SaySomethingSuccess(result);
}
// It would be nice if I had access the **error** here.
return new AppActions.SaySomethingFail();
}));
});
Обратите внимание, что я использую catchError
на внутреннем наблюдаемом, чтобы поддерживать внешнее наблюдаемое, если базовый сетевой вызов терпит неудачу (service.saySomething(action.payload)
):
catchError((error) => {
// What can I do with error here?
return of(null);
})
Последующие операторы tap
и map
учитывают это в своих подписях, разрешая null
, т.е. (result: Result | null)
. Однако я теряю информацию об ошибке. В конечном итоге, когда последний метод map
возвращает new AppActions.SaySomethingFail();
, я теряю любую информацию об ошибке.
Как я могу сохранить информацию об ошибке по всему каналу, а не терять ее в момент обнаружения?