У меня проблема при получении ответа об ошибке http (ошибка проверки 422 из серверной части).
После получения ответа об ошибке http я не могу повторно запустить запрос (при нажатии кнопки).
1) У меня есть свойство объекта, и я вызываю .next (whatEverDataForTheRequest), чтобы отправить запрос к API.
2) В конструкторе я подписываюсь на тему (.asObservable), и здесь все идет нормально, когда ответ успешен, но не когда возникает ошибка.
Код в настоящее время такой:
// Properties -> Subject + Observable, used when button is clicked
private saveBookingSubject: Subject<BookingUpdateInterface> = new Subject<BookingUpdateInterface>();
private saveBookingObservable = this.saveBookingSubject.asObservable();
Когда нажимается кнопка, я создаю полезную нагрузку / объект и передаю его следующим образом:
this.saveBookingSubject.next(payload)
Затем в конструкторе у меня есть следующий код, который запускается при вызове .next.
const sub = this.saveBookingObservable.pipe(
tap(data => {
this.bookingError = null;
this.dialogCanClose = false;
}),
debounceTime(500),
switchMap(booking => {
return this.bookingService.update(booking).pipe(catchError(error => throwError(error)));
})
).subscribe((response: any) => {
// This works - Called on success
console.log('ok', response);
}, (http: HttpErrorResponse) => {
// This works - Gets called on error
console.log(http);
});
Успешный запрос работает так, как задумано - но когда от бэкэнда поступает ошибка, то вызывается:
this.saveBookingSubject.next(payload)
... полностью игнорируется при каждом нажатии кнопки -> И логика подписки никогда не срабатывает.
Что мне здесь не хватает? (Отписываюсь в ngOnDestroy)
Спасибо!
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ - РАБОЧИЙ ПРИМЕР (как опубликовано Мартином)
const sub = this.saveBookingObservable.pipe(
debounceTime(500),
switchMap(booking => {
return this.bookingService.update(booking).pipe(
catchError(httpError => {
this.bookingError = httpError.error.data;
return of(null);
})
);
}),
retry(1)
).subscribe((response: any) => {
// Handle success
}
});