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调用在重试时被取消。也许我的实现有问题,我会更深入地检查一下。你是说在第一次重试之后?这是预期的行为