我正在使用Angular 4.3.5。我们的应用程序有"程序"用户可以"订阅"至。我有一个路由器保护功能,如下所示:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const programName = route.params['program_name'];
const programId = this.programService.getIdForName(programName);
if (this.userService.isLoggedIn() && this.subscriptionService.isSubscribed(programId)) {
return true;
} else {
this.router.navigate(['']);
return false;
}
}
要获取程序ID,我需要调用服务器。要获取用户的订阅列表并确定他们是否订阅了此特定程序,我需要调用服务器。
使用RxJS服务器调用是异步的。但是,我的canActivate
函数被约束为返回布尔值。我不确定如何弥合这个异步/同步编程差距。
例如,在RxJava中,我可以调用toBlocking()
来等待HTTP调用解析。但是RxJS中没有这样的运算符。我已尝试toArray()
和take(1).toArray()[0]
,但似乎没有任何效果。
事实上,我想把这个异步/同步网桥降低;即我希望subscriptionService.isSubscribed(programId)
返回boolean
而不是Observable<boolean>
,因为我可以在SubscriptionService
中缓存订阅列表,这样我就不需要了每次呼叫服务器;但我认为这不会改变编程挑战。
答案 0 :(得分:0)
JS中没有像阻止这么薄的东西。
Angular可以处理返回的可观察
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const programName = route.params['program_name'];
return this.programService.getIdForName(programName).map(pn => {
if (this.userService.isLoggedIn() && this.subscriptionService.isSubscribed(programId)) {
return true;
} else {
this.router.navigate(['']);
return false;
}
});
}
答案 1 :(得分:0)
canActivate
函数可以返回Observable<boolean>
。