0

如果我在 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。

4

1 回答 1

0

请注意,CanActivate'canActivate方法的返回签名是:

Observable<boolean>|Promise<boolean>|boolean

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

然而,这不是你给它的;如果有 atoken你返回一个布尔值,但如果没有你什么也不返回;return 回调内部根本不会改变返回的内容canActivate。因此,正如目前所写,守卫不会等待服务的响应。

如果您控制服务,则应该将其重构为使用可观察对象而不是使用回调,因为这更自然地适合基于 RxJS 的 Angular 世界。如果没有,您需要将回调转换为 promise 或 observable;参见例如从回调中制作 Observable,或fromCallback。为了一致性,你也应该return Observable.of(false)在其他情况下。

于 2017-05-19T12:25:42.550 回答