等待RxJS操作 - 阻塞?

时间:2017-08-25 17:07:43

标签: angular rxjs

我正在使用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中缓存订阅列表,这样我就不需要了每次呼叫服务器;但我认为这不会改变编程挑战。

2 个答案:

答案 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>