Angular2 - 返回布尔与订阅canActivate

问题描述:

我是Angular中的新手,我需要实现一个返回true/false的函数,我将使用canActivate守护进程中的返回值,但此函数通过http.get使用api,所以就像通讯是异步的,这个函数总是返回FALSE,因为http.get还在处理中。Angular2 - 返回布尔与订阅canActivate

我班后卫:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 

    let url: string = state.url; 


    if (this.loginService.isLoggedIn()) { 
     return true; 
    } 

    this.loginService.redirectUrl = url; 

    this.router.navigate(['login']); 

    return false; 
} 

和功能isLoggedIn()

isLoggedIn() { 

    let logged: boolean = false; 

    this.http.get('api/values', this.httpService.headers()) 
     .map((res: Response) => { 
      logged = res.json(); 
     }); 

    return logged; 

} 

我读了很多问题,但我不找到了答案。

分型后卫说,它可以返回

Observable<boolean>, Promise<boolean> or boolean 

所以更改isLoggedIn到:

isLoggedIn() { 

    return this.http.get('api/values', this.httpService.headers()) 
    .take(1) 
    .map((res: Response) => res.json()); 
}  

更新

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    let url: string = state.url; 

    return this.isLoggedIn().map(loggedIn => { 
     if(!loggedIn) { 
     this.loginService.redirectUrl = url; 
     this.router.navigate(['login']); 
     } 
     return loggedIn; 
    } 
} 
+0

感谢套件,但这种方式不叫我的API。如果我更改为:return this.http.get('api/values',this.httpService.headers())。subscribe(res => res.json())my api is call,res.json()isn作为函数的值返回,如何返回订阅的结果作为函数的值 – Rit

+0

我编辑了我的答案。在map()中我没有返回值。现在它应该工作。不要在subscribe()返回Subscribe不可观察时调用它。 – kit

+2

AFAIK您还需要在末尾添加'.first()'或'.take(1)',以便观察者在第一个事件之后关闭。否则,路由器会一直等待。 –