Я работаю над проектом, который использует единый вход для нескольких приложений. Тем не менее, приложение имеет свою отдельную службу подписки. Мы получаем имя пользователя и адрес электронной почты от 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();
, который работает - если не работает бэкэнд, или есть какая-то другая ошибка повторного получения. Если ошибка не может быть устранена, она будет повторять мою трубку бесконечно.