Функция передачи RxJS в пользовательском обработчике ошибок - PullRequest
0 голосов
/ 04 ноября 2018

Как мне сделать эту работу?

switchMap((value: number) => throwError(value)
  .pipe(
    customeErrorHandler((value: number) => value * 3)
  );
);

export const customErrorHandler = (function: Function) =>
  catchError() => of( the function passed as parameter evaluated with the value );

Не передавая функцию и значение в качестве отдельных аргументов, все дело в этом.
Например, с NgRx с эффектом, который вы возвращаете:

map(() => new SuccessAction()),
catchError((value: number) => new FailureAction(value))

Я хочу сделать то же самое, что и catchError, но с использованием собственного обработчика.
Кроме того, он должен обрабатывать ошибку, не влияя на случай успеха, он будет передан в конвейер эффектов, и возвращаемое действие будет отличаться для успеха и неудачи.

f.e:.

type ActionCreationFunction = (payload: any) => Action;

export const effectsErrorHandler = (failureAction: ActionCreationFunction) =>
    catchError((err: any): Observable<Action> =>
      of(failureAction(payload))
         .pipe(tap(() => console.log(err))),

Об эффекте:

.pipe(
  map(() => new AuthLoginSuccess()),
  effectsErrorHandler((counter: number) => new AuthLoginFailure(counter)),
);

На основании ссылки, предоставленной @martin, это сработало:

export const effectsErrorHandler = (failureAction: ActionCreationFunction) =>
    source =>
        Observable.create(subscriber =>
            source.subscribe(
                value => subscriber.next(value),
                err => subscriber.next(failureAction(err))
                    .pipe(tap(() => console.log(err))),
            ),
        );

Но разве нет способа просто обернуть catchError, как в моем примере, вместо того, чтобы обернуть все как здесь?

1 Ответ

0 голосов
/ 04 ноября 2018

Это то, что я искал:

export const effectsErrorHandler = (failureAction: ActionCreationFunction) =>
    (source: Observable) =>
        source
            .pipe(
                catchError(err =>
                    of(failureAction(err))
                        .pipe(tap(() => console.log(err))),
                ),
            );

Теперь я могу расширить его для моего варианта использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...