【发布时间】:2019-10-15 00:18:50
【问题描述】:
我在我的第一个 Angular 应用程序中构建了一个错误拦截器,这对我来说是全新的。当出现401 响应代码时,拦截器会尝试刷新 Firebase 授权令牌。因此,我编写了以下代码:
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(private authService: AuthService, private alertService: AlertService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
catchError(err => {
if (err.status === 401) {
let user = localStorage.getItem('currentUser');
if (!user) {
this.logout(false);
return throwError(err.error);
}
let currentUser = JSON.parse(user);
if (!currentUser || !currentUser.stsTokenManager || !currentUser.stsTokenManager.accessToken) {
this.logout(false);
return throwError(err.error);
}
const reference = this;
this.authService.getToken(currentUser, true).then(t => {
// How do I await and return this properly?
return reference.updateTokenAndRetry(request, next, currentUser, t);
}); // Get token and refresh
}
this.alertService.showAlert({
text: 'Fout tijdens het verzenden van het verzoek',
});
return throwError(err.error);
})
);
}
updateTokenAndRetry(request: HttpRequest<any>, next: HttpHandler, currentUser: any, token: string): Observable<HttpEvent<any>> {
// Update local stored user
currentUser.stsTokenManager.accessToken = token;
localStorage.setItem('currentUser', JSON.stringify(currentUser));
// Add the new token to the request
request = request.clone({
setHeaders: {
Authorization: token,
},
});
return next.handle(request);
}
令牌可以正常刷新。但是刷新后网络调用没有被执行,reference.updateTokenAndRetry(request, next, currentUser, t); 应该这样做。
我认为这是因为this.authService.getToken(currentUser, true) 返回了Promise(这是 Firebase 插件,无法更改)。我想返回return reference.updateTokenAndRetry(request, next, currentUser, t);,但这是不可能的,因为它位于异步功能块中。
如何等待或返回下一个网络调用?我无法创建intercept 函数async。在这一点上我很困惑。
【问题讨论】:
标签: angular typescript angular7