Завершить запрос при ошибке в Angular Interceptor

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

error.interceptor.ts

return next.handle(req).pipe(
    timeout(timeOut),
    catchError((error: HttpEvent<any>) => {
        if (error instanceof HttpErrorResponse) {
            if (error.status !== 401) {
                const errorMessage = typeof error.error === 'string' ? error.error : 'Unhandled Error! please try again'
                this.toast.danger('', errorMessage);
            }
            if (error.status === 440) this.userService.logout(true);
        }
            
        return throwError(error);
    })
);

образец.компонент.тс

this.proxy.CreateVersion(model).pipe(takeUntil(this.unsubscribe$)).subscribe(
    result => {
        console.info(result)
    },
    console.error,
    () => this.loading.grid = false        // Not Working
)

У вас есть this.loading.grid в обработчике complete. Похоже, вы хотите вместо этого поместить его в обработчик error.

martin 21.12.2020 13:51

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

MajiD 21.12.2020 13:58

Это должно работать так. Вы уверены, что используете метод complete с использованием журнала?

Marco 21.12.2020 14:25

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

MajiD 21.12.2020 14:36
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
4
566
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В своей ошибке ты поймаешь и отпустишь

catchError(err => {
  /* do some stuff */
  return throwError(err);
})

Это эквивалентно tap для ошибки. Это позволяет вам что-то делать в случае ошибки, ничего не меняя в вашем потоке.

Однако если вы хотите поймать свою ошибку, а затем успешно завершить трансляцию (теперь, когда вы поймали и обработали свою ошибку), это обычно выглядит так.

catchError(err => {
  /* do some stuff */
  return of({defaultValue});
})
catchError(err => {
  /* do some stuff */
  return EMPTY;
})

Оба этих подхода превращают поток с ошибками в успешный поток, который будет вызывать обработчик complete вместо обработчика error в окончательной подписке.

Другие вопросы по теме