Наблюдаемая ошибка, выполнить другое наблюдаемое, повторить исходное наблюдаемое (Angular, RxJs6) - PullRequest
0 голосов
/ 10 апреля 2020

Я работаю над проектом, который использует единый вход для нескольких приложений. Тем не менее, приложение имеет свою отдельную службу подписки. Мы получаем имя пользователя и адрес электронной почты от SSO, чтобы создать подписку. Если подписка уже существует, мы редактируем ее, в противном случае мы создаем новую.

Я пытаюсь записать это в наблюдаемую трубу для подписки тоже.

В основном сначала попробуйте отредактировать подписку (мы предполагаем, что он существует), однако, если это не удается с определенной ошибкой (пользователь не существует) - создайте новую подписку, а затем go вернитесь к ее редактированию. Если происходит сбой с другой ошибкой, например с ошибкой сервера, просто сгенерируйте эту ошибку.

Моя проблема заключается в правильной записи этой логики c. Вот что у меня есть:


    this.userSubscriptionService.getSubscriptions(this.userName).pipe(
      catchError((err) => {
        if (err.error.message === 'Enter a valid username') {
          return this.userSubscriptionService.createSubscription(this.userName, this.emailAddress);
        } else {
          return throwError(err);
        }
      }),
      flatMap((userSubs: IUserSubscriptions) => this.editSubscription(userSubs))
    ).subscribe();

Сначала я получаю подписку, чтобы редактировать ее с новой информацией. Однако если getSubscription выдает ошибку, я хочу создать подписку, используя имя пользователя и адрес электронной почты, полученные из отдельной службы единого входа, а затем отредактировать новую подписку, включив в нее новую информацию.

createSubscription вернет только возврат логическое значение, основанное на том, сработало ли это, тогда как getSubscription возвращает всю необходимую мне информацию.

У меня возникают проблемы с выяснением, как записать логи повторных попыток c после того, как я поймаю ошибку.

Пожалуйста, дайте мне знать, если вам нужна информация ..

Спасибо за любые отзывы.

===================== ==== Редактировать =======================

Итак, в конечном итоге я пытаюсь решить, если пользователь не существует, создайте пользователя, затем перезапустите весь канал. И я придумал этот


    this.userSubscriptionService.getSubscriptions(this.userName).pipe(
      catchError((err) => {
        if (err.error.message === 'Enter a valid username') {
          return this.userSubscriptionService.createSubscription(this.userName, this.emailAddress);
        } else {
          return throwError(err);
        }
      }),
      flatMap((userSubs: IUserSubscriptions) => this.editSubscription(userSubs)),
      retryWhen(err => {
        return err;
      }),
    ).subscribe();

, который работает - если не работает бэкэнд, или есть какая-то другая ошибка повторного получения. Если ошибка не может быть устранена, она будет повторять мою трубку бесконечно.

1 Ответ

0 голосов
/ 11 апреля 2020

Вот ответ, который я придумал. До сих пор я не смог сломаться, и это не кажется ужасно плохой практикой. Однако я не удивлюсь, если найдется лучшее решение или более правильный синтаксис. Пожалуйста, сообщите.

this.userSubscriptionService.getSubscriptions(this.userName).pipe(
  catchError((err) => {
    if (err.error.message === 'Enter a valid username') {
      return this.userSubscriptionService.createSubscription(this.userName, this.emailAddress);
    } else {
      return throwError(err);
    }
  }),
  flatMap((userSubs: IUserSubscriptions) => this.editSubscription(userSubs)),
  retry(1),
).subscribe();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...