Как правильно вернуть catchError в Rxjs — чтобы не происходила отписка?

Есть такой стрим события click:

fromEvent<any>(this.sendBtn.nativeElement, 'click')
            .pipe(
                map((event) => event.target.value),
                tap(() => this.documentSend$.next(true)),
                switchMap(() =>
                    this.applicationDocumentsService
                        .sendrequest({
                            appid: this.appid,
                            req: this.requestDocument,
                        })
                        .pipe(
                            catchError((error) => of(error)),
                            finalize(() => this.documentSend$.next(false)),
                        ),
                ),

                takeUntil(this.closed$),
            )
            .subscribe(
                (response) => {
                    console.log(response);
                    this.dialogRef.close(response);
                },
                (err: HttpErrorResponse) => {
                    this.messageService.showMessage('', `${err.error}`, 'error');
                },
            );


Проблема заключается в том, что для внутреннего обсервера я возвращаю catchError((error) => of(error)), в случае если сервер отвечает ошибкой http.code !== 200. Делаю это для того - чтобы не ыбло отписки от внутреннего обсервера. Чтобы следующий клик не переставал пропускать данные.

Отсюда другая проблема - в console.log(response); всегда приходит ответ или http errror или success. Как перенаправить error в блок (err: HttpErrorResponse) => {}?
  • Вопрос задан
  • 37 просмотров
Решения вопроса 2
search
@search
мама говорит что я особенный
Как только вы попали в callback error функции subscribe - это означает что поезд ушел и прийдётся что-то мудрить чтоб переподписаться на
fromEvent<any>(this.sendBtn.nativeElement, 'click')


Каких-то магических операторов для того чтоб и в функцию error попасть и подписку при этом сохранить не существует. Можно, конечно, сделать как-то так:

import { EMPTY } from 'rxjs';

fromEvent<any>(this.sendBtn.nativeElement, 'click')
  .pipe(
    map((event) => event.target.value),
    tap(() => this.documentSend$.next(true)),
    switchMap(() =>
      this.applicationDocumentsService
        .sendrequest({
          appid: this.appid,
          req: this.requestDocument,
        })
        .pipe(
          cachError((error: HttpErrorResponse) => {
            this.messageService.showMessage('', `${err.error}`, 'error');
            return EMPTY;
          }),
          finalize(() => this.documentSend$.next(false)),
        )
    ),

    takeUntil(this.closed$)
  )
  .subscribe((response) => {
    console.log(response);
    this.dialogRef.close(response);
  });
Ответ написан
Xuxicheta
@Xuxicheta
инженер
с горячего потока типа fromEvent можно выпасть в ошибку, а потом благополучно подписаться заново с помощью retry

Но от холодного так не прокатит, подписка будет заново вызывать его.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы