RXJS基于另一个订阅结果重试

RXJS基于另一个订阅结果重试,rxjs,Rxjs,我正在调用需要在服务器上进行身份验证的端点 /users/:userId/my/endpoint=>getData():可观察的 如果身份验证过期,服务器将以错误响应。然后我就可以用我邮寄的客户端密码刷新这个身份验证了 /refresh/me=>refreshAuth():可观察的 在那之后,我将再次发送第一个请求并获得成功响应(happy case) 我如何用一个可观察的目标来实现这一点?我知道,例如有catchError和retry getData() .pipe( catchE

我正在调用需要在服务器上进行身份验证的端点

/users/:userId/my/endpoint=>getData():可观察的

如果身份验证过期,服务器将以错误响应。然后我就可以用我邮寄的客户端密码刷新这个身份验证了

/refresh/me=>refreshAuth():可观察的

在那之后,我将再次发送第一个请求并获得成功响应(happy case)

我如何用一个可观察的目标来实现这一点?我知道,例如有
catchError
retry

getData()
  .pipe(
    catchError(e => {
      if (error.code === 1224) {
        return refreshAuth();
      }

      return throwError(error);
    }),
    retry(1)
  ).subscribe();

但这将重试每个错误情况,对吗?如何在特定身份验证过期的情况下重试整个链?

这是如何实现的:

getData()
  .pipe(
    retryWhen(error => error.pipe(
      exhaustMap(e => (e.code == 1224) ? refreshAuth() : throwError(e))),
      take(1)
    )
  )
  .subscribe();

查看
retryWhen
,这样您就可以检查错误,并且只有当它符合您的标准时才发出重试消息。这已经帮了大忙,谢谢。但是如果
refreshAuth()
失败,那么
getData()
现在将在无限循环中调用。如何确保整个链条只重复一次?请尝试我更新的示例
exhaustMap()
,以获得胜利,谢谢!在这里的帮助下,我还可以使用
concatMap
iif
解决这个问题,但您的解决方案更干净!还有一件奇怪的事。。。
getData()
get后面的API调用在重试时被取消。也许我的实现有问题,我会更深入地检查一下。你是说在第一次重试之后?这是预期的行为