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

时间:2020-04-10 20:43:40

标签: angular typescript rxjs observable rxjs6

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

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

1 个答案:

答案 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();