为什么Angular 2的CanActivate会返回一个Observable <boolean>而不是Promise?

时间:2016-08-10 20:45:01

标签: javascript angular rxjs rxjs5

CanActivate class允许Observable<boolean>返回类型。

对我来说唯一有用的用例是:

  1. CanActivate可以“异步”阻止正在显示的路由,直到observer.next(true|false)被调用。
  2. 我可以显示CanActivate允许的路线,然后从我应用的其他部分推送observer.next(false)并让该路线消失。
  3. 然而,第一点有效但不是第二点。因此,我找不到CanActivate应该允许返回类型Observable<boolean>而不是方便的原因 - 这反过来使API复杂化。如果CanActivate仅允许boolean返回类型和Promise,则会更清晰。

    请注意,我是Angular,RxJS以及基于Node的新手,所以我可能会忽略这一点。我花了一些时间尝试从CanActivate中提取Observer<boolean>返回类型所暗示的功能。

3 个答案:

答案 0 :(得分:0)

在AngularJS 2中,几乎每个异步操作都返回Observable。因为您可以实现自己的CanActivate,所以您可能希望通过服务器访问来实现。例如,检查服务器中的管理员凭据。您可以看到类似的示例here

如果此方法返回了布尔数据类型,则您需要阻止该页面才能执行此操作。

答案 1 :(得分:0)

它允许您执行一些异步过程。想象一下,您有一个来自身份验证服务的.bashrc可观察对象。这是一个currentUser并且将始终返回当前登录的用户,但是当您的应用首次加载时,auth呼叫可能仍在处理中,因此您不知道它是否已完成。

ReplaySubscriber(1);

答案 2 :(得分:0)

在Angular 7中,canActivate可以返回ObservablePromise和一个简单的boolean,并且HTTP调用也是如此,因此您可以返回适合您的任何类型,对我来说,我将它们都用作以下内容:

对于Observable

public getCats(): Observable<Cat[]> {

    return this.http.get<Cat[]>(this.catsUrl, this.getHttpOptions()).pipe(
      tap(_ => this.log('fetched cats')),
      catchError(this.handleError())
    );
  }

canActivate的情况下,我将Promise<boolean>HTTP一起使用,情况如下:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    const currentUser = this.getCurrentUser();
    if (currentUser) {
        return this.http.post<any>(this.validateUserUrl, this.userData).toPromise().then(
            response => 
            {
                return true;
            }
        ).catch(
            error=>
            {
                this.logout()
                return false;
            }
        );
    }
    return new Promise<boolean>(()=> {return false;});
}
相关问题