Ловить отчетливые ошибки в RxJS - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть Angular перехватчик HTTP. Приложение использует таймер Rx JS для отправки запросов (короткий опрос). Каждые 5 секунд он отправляет около 10 запросов. Я хочу использовать перехватчик для обработки 502-504 кодов состояния. Я знаю, как отлавливать ошибки, но проблема в опросе.

Как только я отправляю 10 запросов, я получаю 10 ошибок почти одновременно. Я хотел бы distinctUntilChanged() или хотя бы take(1) как-то, но обе вещи не работают вместе с catchError().

export class ErrorInterceptor implements HttpInterceptor {
    constructor(private readonly store: Store<AppState>) { }

    intercept(request: HttpRequest<string>, next: HttpHandler): Observable<HttpEvent<string>> {
        const errorCodes = [502, 503, 504];

        return next.handle(request).pipe(
            // take(1),
            // distinctUntilChanged(), // both lines not working, because error is thrown earlier
            catchError(err => {
                if (errorCodes.includes(err.status)) this.store.dispatch(connectionLost());

                return throwError(err);
            })
        );
    }
}

Я знаю, что могу отправить новое действие об ошибке и использовать distinctUntilChanged по своему действию. Но я получу это действие 10 раз в Redux DevTools. Я бы хотел этого избежать.

Есть идеи?

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете использовать materialize() и dematerialize(). Используя materialize(), вы можете подавлять входящие ошибки и отправлять их как уведомления об ошибках ( не ошибок как таковых), а затем вы можете предоставить пользовательский compare fn для distinctUntilChanged.

return next.handle(request).pipe(
  /* ... */
  materialize(), // Convert into notification
  distinctUntilChanged(yourCustomFn),
  /* ... */
  dematerialize() // Get back the `original value`
  /* ... */
);
...