我正在研究一个在多个应用程序中使用SSO的项目。但是,该应用程序具有自己的单独订阅服务。我们从SSO获取用户名和电子邮件,以创建订阅。如果订阅已经存在,请对其进行编辑,否则我们将创建一个新的订阅。
我正尝试将其写在可观察的管道中以进行订阅。
基本上首先尝试编辑订阅(我们假设它存在),但是,如果订阅失败并出现特定错误(用户不存在),请创建一个全新的订阅,然后再重新编辑。如果它因其他错误(例如服务器错误)而失败,则只需抛出该错误即可。
我的问题是正确编写此逻辑。这是我所拥有的:
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抛出错误,我想使用从单独的SSO服务获得的用户名和电子邮件创建订阅,然后编辑全新的订阅以包括新信息。
createSubscription将仅根据布尔值是否有效返回一个布尔值,而getSubscription将返回我需要的所有信息。
发现错误后,我很难弄清楚如何编写重试逻辑。
如果您需要信息,请告诉我。
谢谢您的反馈。
=========================编辑==================== ===
所以最终我要解决的是,如果该用户不存在,请创建该用户,然后重新启动整个管道。我想出了这个
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();
有效的方法-除非后端关闭或出现其他一些重复发生的错误。如果错误无法解决,它将无限重试我的管道。
答案 0 :(得分:0)
这是我想出的答案。到目前为止,我还没有休息过,这似乎不是非常糟糕的做法。但是,如果有更好的解决方案或更合适的语法,我不会感到惊讶。请告知。
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();