在AuthGuard中使用回调函数

时间:2017-05-19 12:11:16

标签: angular angular-router-guards

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

1 个答案:

答案 0 :(得分:0)

请注意CanActivatecanActivate方法的返回签名是:

Observable<boolean>|Promise<boolean>|boolean

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

然而, 你所给予的东西;如果有一个token你返回一个布尔值,但是如果你没有返回任何东西;回调中的return 根本不会改变从canActivate返回的内容。因此,正如目前所写,警卫不会等待服务的响应。

如果你控制服务,你应该重构它以使用observable而不是回调,因为这更适合基于RxJS的Angular世界。如果没有,您将需要将回调转换为promise或observable;见例如Making an Observable from a callbackfromCallback。为了保持一致性,在另一种情况下您也应该return Observable.of(false)