проблема в том, что когда происходит ошибка, полный обратный вызов не работает, чтобы скрыть индикатор загрузки. и я не хочу использовать оператор 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
)
Да, но я хочу скрыть загрузку при ошибке и успехе. я должен поместить его как в ошибку, так и в полный обратный вызов? Мне нужен лучший способ сделать это
Это должно работать так. Вы уверены, что используете метод complete
с использованием журнала?
Да, я уверен. полный обратный вызов работает только в том случае, если запрос выполнен без ошибок. поэтому мне нужно скрыть загрузку по ошибке и завершить обратные вызовы, и это не похоже на хорошую практику
В своей ошибке ты поймаешь и отпустишь
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
в окончательной подписке.
У вас есть
this.loading.grid
в обработчикеcomplete
. Похоже, вы хотите вместо этого поместить его в обработчикerror
.