可观察到的错误,执行其他可观察到的,重试原始可观察到的(Angular,RxJs6)

问题描述 投票:0回答:1

我正在一个跨多个应用程序使用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();

这可以工作-除非后端关闭或出现其他一些重复发生的错误。如果错误无法解决,它将无限重试我的管道。

angular typescript rxjs observable rxjs6
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.