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;
}
}
感谢套件,但这种方式不叫我的API。如果我更改为:return this.http.get('api/values',this.httpService.headers())。subscribe(res => res.json())my api is call,res.json()isn作为函数的值返回,如何返回订阅的结果作为函数的值 – Rit
我编辑了我的答案。在map()中我没有返回值。现在它应该工作。不要在subscribe()返回Subscribe不可观察时调用它。 – kit
AFAIK您还需要在末尾添加'.first()'或'.take(1)',以便观察者在第一个事件之后关闭。否则,路由器会一直等待。 –