http请求的Angular4问题

时间:2018-01-25 07:59:02

标签: javascript angular callback return-value angular4-router

在我的Angular 4应用程序中,我正在开发一个誓言警卫服务。在那里,我想检查令牌是否有效,如果没有,用户需要再次登录。

以下是我用来实现我想要的功能:

isLogedIn(){

    return this.http.get(this.baseUrl+"/check-token?token="+this.currentUser.token).map(res => res.json())
    .subscribe(response => {
          let logedinUser = JSON.parse(localStorage.getItem('currentUser'));
                if(response.message == "_successful" && localStorage.getItem("currentUser") != null){
                    return true;
                }else{
                    return false;
                }
             },err =>{ 
                console.log(err); 
                return false;
           });

}

但事情是在auth gurd函数中我无法获得此函数的确切输出值。贝娄是我的autur gurd功能:

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    console.log(this.userService.isLogedIn());
    if (this.userService.isLogedIn()) {
      return true;
    } else {
      this.router.navigate(['/login'], {
        queryParams: {
          return: state.url // curent url as a parameter to the login page
        }
      });
      return false;
    }
  }

当我使用console.log(this.userService.isLogedIn());时,它会打印订阅者对象而不是返回值。如何从isLogedIn()函数返回值?

2 个答案:

答案 0 :(得分:1)

因为您确实要退回订阅。 `

  • this.http.get(...)Observable;
  • this.http.get(...).map(...)Observable;
  • this.http.get(...).map(...).subscribe(...)Subscription;

subscribe方法返回Subscription,而不是return something例程内的subscribe

我建议您:在守卫中返回观察者本身(canActivate接受Observable<boolean>作为回报)。请勿在{{1​​}}致电subscribe

isLogedIn()

注意我调用isLogedIn(): Observable<boolean>{ return this.http.get(this.baseUrl+"/check-token?token="+this.currentUser.token).map(res => res.json()) .map(response => { let logedinUser = JSON.parse(localStorage.getItem('currentUser')); if(response.message == "_successful" && localStorage.getItem("currentUser") != null){ return true; }else{ return false; } }); } 两次:最后一个是操纵你的响应以返回一个布尔值。最后,在map

canActivate

我插入了操作符do,这是一个独立的回调,用于管理您的路由。

答案 1 :(得分:0)

你的功能应该是

isLogedIn(): Observable<boolean> {
    return this.http.get(this.baseUrl + '/check-token?token=' + this.currentUser.token)
        .map((res: Response) => {
            const response = res.json();
            return response.message == "_successful" && localStorage.getItem("currentUser") != null;
        }).catch((error: Response) => {
            return false;
        });
}