首页 文章

返回不使用canActivate中的Observable.toPromise():Angular 4

提问于
浏览
0

我添加了一个路由保护来检查用户是否经过身份验证并可以登录该应用 . 下面是一个代码片段,显示了如果用户是否经过身份验证,我将如何处理2个不同的条件:

if (this.adal.user.isAuthenticated) {
  return true;
} else {
  this.adal.acquireToken(clientId).toPromise().then((data) => {
    console.log('Refreshed the token.');
    return(true);
  }).catch ((error) => {
     console.log('No user logged in.');
     this.router.navigate(['/login']);
     return(false);
  });
}

问题是当调用代码的else部分时,即调用acquireToken()时,它返回一个我正在转换为promise的observable . 令牌更新后,我将返回true . 但是,当发生这种情况时,我看到一个空白页面,好像从未调用“return true” . 不知道为什么会这样,也许我使用toPromise方法的方式不对 . 如果有人能给我一点暗示,那就太好了 .

1 回答

  • 0

    According to the interface defintion,CanActivate可以返回Observable,Promise或boolean但不是订阅:

    interface CanActivate {    
       canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
         Observable<boolean> | Promise<boolean> | boolean 
    }
    

    您可以像这样更改代码:

    if (this.adal.user.isAuthenticated) {
      return of(true);
    } else {
      this.adal.acquireToken(clientId).pipe(map(() => true))
      .catch ((error) => {
         console.log('No user logged in.');
         this.router.navigate(['/login']);
      });
    }
    

相关问题