Angular rxjs: поддерживать подписки, обрабатывающие ошибки http - PullRequest
0 голосов
/ 19 июня 2019

При нажатии кнопки вызывается 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));

То, что я пытаюсь сделать, это когда возникает ошибка:

  1. Пустой пользователь отправляется на pushed$ наблюдаемый.
  2. Подробное сообщение об ошибке выдается 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:

  1. Это поймано, но поднято снова, возвращая Observable.throw обработку error response.
  2. На pushed$ можно наблюдать, также ловить с помощью

1 Ответ

0 голосов
/ 19 июня 2019

Поскольку вы повторно выбрасываете ошибку в свой поток this.service.push(), чтобы не прерывать поток кликов, вам придется сдерживать и отлавливать ошибку во внутренней наблюдаемой

let saveClickPush$ = Observable
    .fromEvent(this.saveButton.nativeElement, 'click')
    .pipe(
        switchMap(() => this.service.push(this.user).pipe(catchError(e=>of(e))),
        share()
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...