在 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的

请注意 CanActivatecanActivate 方法的 return 签名是:

Observable<boolean>|Promise<boolean>|boolean

所以它可以处理异步响应。

但是,这不是你给它的东西;如果有 token 你 return 一个布尔值,但如果没有你 return 什么都没有;回调 中的 return 根本不会改变 return 从 canActivate 编辑的内容。因此,正如目前所写,守卫不会等待服务的响应。

如果您控制该服务,您应该重构它以使用可观察对象而不是进行回调,因为这更自然地适合基于 RxJS 的 Angular 世界。如果不是,则需要将回调转换为 promise 或 observable;参见例如, or fromCallback。为了保持一致性,您还应该 return Observable.of(false) 在另一种情况下。