返回值直接订阅到canActivate auth guard

时间:2018-03-21 01:49:02

标签: angular asynchronous auth-guard

下面是我的代码,我要做的是尝试将返回值直接转换为canActivate返回,但问题是它会在运行之前先运行检查" this._authService.isAdmin(token)& #34;方法。我知道这是因为异步。但是如何预防呢?我已经有了想法。提前谢谢。

我已经尝试将该方法放在construtor上,但结果仍然相同。

import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AuthenticationService } from "../_services/authentication.service";

@Injectable()
export class AdminGuard implements CanActivate  {

  isAdmin: boolean = false;

  constructor(
    private _authService: AuthenticationService,
    private router: Router) {
  }

  canActivate(): Observable<boolean> | Promise<boolean> | boolean {

  var token = this._authService.getJwtToken();
  this._authService.isAdmin(token).subscribe(
     res => {
            //res will return true or false value
            this.isAdmin = res;
     }
  );

  if(this.isAdmin){
    return true;
  }
  this.router.navigate(['/']);
  return false;

  }
}

1 个答案:

答案 0 :(得分:0)

您可以使用pipeable operators

canActivate(): Observable<boolean> {
  let token = this._authService.getJwtToken();
  return this._authService.isAdmin(token).pipe(
    tap(isAdmin => {
      if (isAdmin) {
        this.router.navigate(['/']);
      }
    })
  );
}

// Usage:
canActivate.subscribe(value => {
  // do something...
});

请注意,tap运算符只执行“副作用任务”。 tap运算符返回的observable与之前的运算符相同。现在,只有在isAdmin observable发出事件后,才会评估点按操作符中的if isAdmin检查。