2017-08-25 134 views
0

我正在使用Angular 4.3.5。我們的應用程序有一個「程序」,用戶可以「訂閱」。我有一個像這樣的路由器保護功能:等待RxJS操作 - 阻止?

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

canActivate函數可以返回一個Observable<boolean>

+0

哈,所以一直觀察到?就這樣吧。 –

0

在JS中沒有這樣薄的阻塞。

角可以處理返回觀察到的

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; 
     } 
    }); 
}