如果我在AuthGuard中有以下CanActivate实现:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let token = localStorage.getItem('token');
if (token) {
this.authService.userInfo(token, (err, result) => {
if (err) return false;
return true;
}
}
return false;
}
警卫会等到回调函数执行,知道下面的userInfo
实际上使用HTTP来调用Auth0。
答案 0 :(得分:0)
请注意CanActivate
的canActivate
方法的返回签名是:
Observable<boolean>|Promise<boolean>|boolean
所以它可以处理异步响应。
然而, 你所给予的东西;如果有一个token
你返回一个布尔值,但是如果你没有返回任何东西;回调中的return
根本不会改变从canActivate
返回的内容。因此,正如目前所写,警卫不会等待服务的响应。
如果你控制服务,你应该重构它以使用observable而不是回调,因为这更适合基于RxJS的Angular世界。如果没有,您将需要将回调转换为promise或observable;见例如Making an Observable from a callback或fromCallback
。为了保持一致性,在另一种情况下您也应该return Observable.of(false)
。