等待一个Observable或boolean方法

时间:2019-12-04 14:05:58

标签: angular rxjs observable

我有一个AuthGuard,我想在我的应用程序中检查我的身份验证状态。

简化后,它应该像这样工作:

  • 如果有{ _id: 5de4debccc333611e4d14d4f5 companies: Google Comp. Inc.$Google Comp. Inc. Estd.$Tree, Ltd.$Tree, Ltd. } ,则返回true
  • 如果没有access_cookieaccess_cookie,则返回false
  • 如果没有refresh_cookie,但只有access_cookie,则请求一个新的refresh_cookie,并在成功后返回true

但是,当然返回简单的真假,但对新access_cookie的请求是access_cookie

我的AuthGuard:

Observable<boolean>

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { ... const result = this.auth.checkCredentials(scopes); console.log(result); .... } (简体):

checkCredentials()

checkCredentials(): boolean{ if (!this.cookieService.check('access_token')) { if(this._getRefreshToken(){ try { this.refresh().subscribe( result=> { return result; }, error => { return false; }); } catch (e) { return false; } } } return true; } 可观察

refresh

refresh(): Observable<boolean> { if (this._getRefreshToken() && !this.cookieService.check('access_token')) { const oauth2_token_endpoint = TOKEN_URL; const headers = new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic ' + btoa(CLIENT_ID + ':' + CLIENT_SECRET), }); const body = 'grant_type=' + GrantType.REFRESH + '&refresh_token=' + this._getRefreshToken(); return this.http.post<UserData>(oauth2_token_endpoint, body, {headers}) .pipe(map(user => { if (user && user.access_token) { this._saveToken(user); return true; } return false; })); } return throwError('Refresh Token Error'); } 被执行,但是它不等待checkCredentials()而是立即返回refresh()

我在哪里缺少什么?

我正在使用Angular 8.2.14和rxjs 6.4.0

1 个答案:

答案 0 :(得分:2)

您的checkCredentials不在嵌套的if块内返回结果,它还订阅了可观察对象而不是返回它。使用map代替subscribe,然后返回Obserable。您还应该在返回类型的方法上更改签名,以使其返回boolean Observable<boolean>

checkCredentials(): boolean | Observable<boolean> {
    if (!this.cookieService.check('access_token') && this._getRefreshToken()) {
      return this.refresh().pipe(map(
        result=> {
          return result;
        }, error => {
          return false;
        }));
    }
    return true;
}

不感兴趣:我将您的2个if块合并为1个。