[英]Multiple Observables sharing single Error rxjs angular
我正在尝试使用 Oauth2 身份验证处理 API 请求。
我有一个authService
具有三个属性( accessToken
、 refreshToken
和refreshTokenObservable
- 稍后描述)和apiGet()
方法,它使用 Authorization 标头创建 HTTP GET 请求,如下所示:
apiGet(cleanedPath:string) {
return this.config.getConfig().pipe(mergeMap((config: Config) => {
[...] // Cleans parameters and creates a final query string
// Adding access token as header
let headers: object = {headers: new HttpHeaders().set('Authorization', this.accessToken)}
return this.http.get<any>(cleanedPath, headers).pipe(catchError(this.handleApiGetError.bind(this, cleanedPath)));
}));
}
我希望handleApiGetError()
方法调用新的刷新令牌并尝试重复apiGet()
,我尝试将多个apiGet()
调用连接到单个可观察对象,如下所示:
private handleApiGetError(cleanedPath:string, error: HttpErrorResponse) {
if (!this.refreshTokenObservable) {
// getAccessByRefreshToken() is simple HTTP post
this.refreshTokenObservable = this.getAccessByRefreshToken();
}
return this.refreshTokenObservable.pipe(mergeMap(()=> {
return this.apiGet(cleanedPath);
}));
}
但是,这不起作用,因为它在每个失败的apiGet()
调用新令牌,导致 OAuth 服务返回多个 E401(令牌已被撤销)。
有没有办法将apiGet()
观察者绑定在一起,并且在错误的情况下只调用一次刷新令牌请求并重新调用失败的apiGet()
调用?
考虑使用retryWhen
只重试一次,最重要的是反转控制,以便您的ErrorHandler
不负责再次重试(通过调用其调用者)。
使用retryWhen
你的 HTTP 请求只会在this.handleApiGetError()
返回的 Observable 完成后重试,如下所示:
apiGet(cleanedPath: string) {
return this.config.getConfig().pipe(
mergeMap((config: Config) => {
return this.http.get<any>(cleanedPath, headers).pipe(
retryWhen(x => this.handleApiGetError())
);
})
);
}
private handleApiGetError(error: HttpErrorResponse) {
return this.refreshTokenObservable;
}
话虽如此, handleApiGetError
可能是不必要的,因为您可以直接调用getAccessByRefreshToken
,如下所示:
apiGet(cleanedPath: string) {
return this.config.getConfig().pipe(
mergeMap((config: Config) => {
return this.http.get<any>(cleanedPath, headers).pipe(
retryWhen(this.getAccessByRefreshToken)
);
})
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.