我正在尝试编写HttpInterceptor,它在API访问令牌到期时刷新它。
主要问题是在刷新令牌请求返回之前保留任何HTTP请求。如果令牌已成功刷新,则可以触发给定的请求,如果没有,则应用程序应该自动注销。
简而言之:
这是我目前的代码:
@Injectable()
export class RefreshTokenInterceptor implements HttpInterceptor {
constructor(private authenticationService: AuthenticationService) { }
public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (this.isRefreshOfAccessTokenUnnecessary()) {
return next.handle(request);
}
return this.authenticationService.refreshToken()
.concatMap(() => next.handle(request))
.filter((item) => item instanceof HttpResponse)
.catch(() => this.refreshTokenFail());
}
private isRefreshOfAccessTokenUnnecessary(): boolean {
...
}
private refreshTokenFail(): ErrorObservable {
this.authenticationService.logOut();
return Observable.throw(new Error('not authorized'));
}
}
问题在于我在使用适当的Observable运算符时遇到了麻烦。 concatMap
似乎有效,但并不完美。令牌刷新没有问题,其他请求正在等待,但这有时会导致重复请求。
有人能指出我来自RxJS的哪个运营商适合吗?说实话,文档并没有多大帮助。
我还没有使用RxJS的lettable运算符。
答案 0 :(得分:0)
您可以使用async
and await
例如,您将拥有一个argumentClause
方法,该方法将返回具有所需结果的承诺(这将是您在执行任何其他操作之前要等待的第一个调用)。
然后,您可以使用其他async
方法和async
方法调用它。
(如果需要,你可以在await
等待它。)
注意:try/catch
仅适用于promises,但您可以使用await
方法解析一个observable,该方法将承诺返回async
。