0

我有一个检查用户会话的警卫。我正在从一个承诺中创建一个可观察对象并返回该可观察对象。

不幸的是,路由器总是在刷新时将我重定向到主页。我想这与可观察对象有关,因为当我简单地导航时,它会输入 if 并返回“Observalbe.of(true)”,这很有效。

@Injectable()
export default class SessionGuard implements CanActivate {

  constructor(private authService: AuthService) {}

  public canActivate(): Observable<boolean> | Promise<boolean> | boolean {
    if (this.authService.hasSessionChecked) {
      return Observable.of(true).take(1);
    }

    const obs = Observable.fromPromise(this.authService.getSession());
    return obs.map((session) => {
      this.authService.setUserSession(session);
      return true;
    }).take(1);
  }
}

我尝试用“return true”替换 observable,一切都按预期工作。

有任何想法吗?谢谢!

4

3 回答 3

0

首先, 的定义canActivate如下:

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

所以你应该在函数中添加参数。

其次,如果你要返回一个 observable 并且只返回一个 observable,那么将返回类型更改为只是 observable。如果您想要混合,那么您可以留下多个返回类型。

第三,删除 take() 操作符并将守卫重构为如下所示:

@Injectable()
export default class SessionGuard implements CanActivate {

  constructor(private authService: AuthService) {}

  public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
    if (this.authService.hasSessionChecked) {
      return true;
    }
    const obs = Observable.fromPromise(this.authService.getSession());
    return obs.map(session => {
      this.authService.setUserSession(session);
      return true;
    });
  }
}
于 2017-06-16T08:57:50.700 回答
0

正如@tricheriche 所建议的那样,我已经用一个承诺替换了可观察对象并返回了它。

现在工作得很好。

return this.authService.getSession().then(
  data => {
    this.authService.setUserSession(data);
    return true;
  },
  err => false,
);
于 2017-06-16T10:47:10.830 回答
0

它不起作用,因为canActivate应该返回一个布尔值。

为什么要使用 Observable ?

于 2017-06-16T08:49:49.097 回答