我正在编写一个 HttpInterceptor
,它将向传出请求添加不记名令牌。调用getAccessTokenSilently
方法获取的不记名令牌。方法是 Auth0
服务的一部分,如果未在本地缓存,则向授权方发出 http 调用以获取令牌。
getAccessTokenSilently(options?: GetTokenSilentlyOptions): Observable<string>;
基本上我的代码必须做到以下几点;
import { AuthService } from '@auth0/auth0-angular';
@Injectable()
export class AuthHttpInterceptor implements HttpInterceptor {
constructor(public auth:AuthService) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = this.auth.getAccessTokenSilently();
return next.handle(req.clone({ setHeaders: { token } }));
}
}
要获取令牌,我需要为 getAccessTokenSilently
订阅观察者,但是当令牌可用时,该方法已经退出。
我尝试使用 await 函数,但它不起作用,因为 getAccessTokenSilently
不返回承诺。
如何在等待令牌可用时暂停我的功能?
答案 0 :(得分:0)
“暂停”Web 应用程序的主线程是,并且永远是一个糟糕的主意。幸运的是,在这种情况下您不必这样做,因为您可以使用 rxjs 来实现您想要做的事情。类似于以下内容应该可以解决问题:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return this.auth.getAccessTokenSilently()
.pipe(
mergeMap((token) => {
return next.handle(req.clone({ setHeaders: { token } }));
})
);
}
如果你打算用 observables 做更多的工作,你绝对应该检查 rxjs 并做一些教程。