При нажатии кнопки вызывается http-запрос:
let saveClickPush$ = Observable
.fromEvent(this.saveButton.nativeElement, 'click')
.pipe(
switchMap(() => this.service.push(this.user)),
share()
);
Итак, когда он щелкает, я создаю две наблюдаемые:
this.pushed$ = saveClickPush$.pipe(this.pushUser(), this.handleEmptyUser());
this.error$ = saveClickPush$.pipe(this.handleError<never>());
где:
private handleError = <T>() => catchError<T, Array<{code: string, message: string}>>((error: ResponseError) => Observable.of(error.errors));
private handleEmptyUser = <T>() => catchError<T, AdministrationUser>(() => Observable.of(UserComponent.EMPTY_USER));
То, что я пытаюсь сделать, это когда возникает ошибка:
- Пустой пользователь отправляется на
pushed$
наблюдаемый.
- Подробное сообщение об ошибке выдается
error$
.
Однако, , когда возникает ошибка http, запрос http больше не вызывается, когда я нажимаю кнопку . Похоже, что все подписчики отписались, когда ранее возникла ошибка http, несмотря на то, что я пытался обработать ошибки.
Мой сервис:
public push(user: AdministrationUser): Observable<AdministrationUser> {
const buildURL = () => map((userId: string) => this.buildPushURL(userId));
return Observable.of(user.id)
.pipe(
buildURL(),
switchMap((url: string) => this.http.post(url, user)
.pipe(
map(() => user),
catchError((error: Response) => Observable.throw(<ResponseError>error.json()))
)
)
);
}
Итак, когда возникает ошибка http:
- Это поймано, но поднято снова, возвращая
Observable.throw
обработку error response
.
- На
pushed$
можно наблюдать, также ловить с помощью