0

我有一个大问题,经过数小时阅读文档和解决方案后,我找不到如何解决这个问题:

基本上我在我的角度保护中有这个:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        return this.checkLogin(route);
    }

    checkLogin(route) {
        return this.authService.login().map(response => {
            if (this.authService.isAuth) {
                return this.authService.grants().map(grants => {
                    if (grants.canRead) {
                        return true;
                    }
                })
            }
        });
    }

我要做的是首先调用服务 authService.login,如果我通过了身份验证,那么我调用 authService.grants 来检查用户是否可以阅读此页面。

就这么简单,但我无法进入第二个电话,我不知道为什么它会返回一个可观察的。

4

1 回答 1

2

如果没有您的方法的定义,我将假设以下内容:

interface Rights {
   canRead: boolean;
}

class AuthService { 
  grants(): Observable<Rights>{}
  login(): Observable<any>{}
}

问题是,目前您的checkLogin方法的返回类型是Observable<boolean>| Observable<Observable<boolean>>. 这是因为:

  • 如果this.authService.isAuthfalse,则外部映射将产生 a Observable<boolean>,因为您只需 return false
  • 如果this.authService.isAuthtrue,则外部映射将产生 a Obsevable<Observable<boolean>>,因为您现在将返回另一个异步的映射值。手术。

因此,使用它,您应该将您的警卫重构为以下内容:

import 'rxjs/add/operator/mergeMap'; // can be refactored to pipe + operator
import {of} from 'rxjs/observable/of';

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
        return this.checkLogin(route);
    }

    checkLogin(route): Observable<boolean> {
        return this.authService.login().mergeMap(_=> {
            if (this.authService.isAuth) {
                return this.authService.grants().map(grants => grants.canRead)
            }else{
                return of(false);
            }
        });
    }
}

MergeMap 基本上允许您连接异步操作,并创建一个可观察的同步。价值。

于 2018-01-23T14:43:26.433 回答