Тим ·

Если в redux-observable невнимательно следить, то легко получить эпик, который умрёт:

const dyingEpic = (action$, state$, _) =>
  action$.pipe(
    filter(isActionOf(API_REQUEST)),
    switchMap(action => apiCallThatReturnsObservable(action.payload.id)),
    map(result => API_SUCCESS(result)),
    catchError(err => of(API_ERROR(err)))
  );

Дело в том, что ошибка в таком случае дойдёт до .pipe, и он благополучно завершится, и новых экшенов обрабатывать не будет.

const resilientEpic = (action$, state$, _) =>
  action$.pipe(
    filter(isActionOf(API_REQUEST)),
    switchMap(action => apiCallThatReturnsObservable(action.payload.id)
      .pipe(
        map(result => API_SUCCESS(result)),
        catchError(err => of(API_ERROR(err)))
      )
    );

Здесь мы создаём вторую, независимую цепочку observable, и когда она упадёт с ошибкой, то switchMap всё равно сможет переключиться на новый.