在 AuthGuard 中使用回调函数
Using a Callback Function in AuthGuard
如果我在 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的
请注意 CanActivate
的 canActivate
方法的 return 签名是:
Observable<boolean>|Promise<boolean>|boolean
所以它可以处理异步响应。
但是,这不是你给它的东西;如果有 token
你 return 一个布尔值,但如果没有你 return 什么都没有;回调 中的 return
根本不会改变 return 从 canActivate
编辑的内容。因此,正如目前所写,守卫不会等待服务的响应。
如果您控制该服务,您应该重构它以使用可观察对象而不是进行回调,因为这更自然地适合基于 RxJS 的 Angular 世界。如果不是,则需要将回调转换为 promise 或 observable;参见例如, or fromCallback
。为了保持一致性,您还应该 return Observable.of(false)
在另一种情况下。
如果我在 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的
请注意 CanActivate
的 canActivate
方法的 return 签名是:
Observable<boolean>|Promise<boolean>|boolean
所以它可以处理异步响应。
但是,这不是你给它的东西;如果有 token
你 return 一个布尔值,但如果没有你 return 什么都没有;回调 中的 return
根本不会改变 return 从 canActivate
编辑的内容。因此,正如目前所写,守卫不会等待服务的响应。
如果您控制该服务,您应该重构它以使用可观察对象而不是进行回调,因为这更自然地适合基于 RxJS 的 Angular 世界。如果不是,则需要将回调转换为 promise 或 observable;参见例如fromCallback
。为了保持一致性,您还应该 return Observable.of(false)
在另一种情况下。