我正在使用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
中,這樣我就不需要每次都調用服務器;但我認爲這不會改變編程挑戰。
哈,所以一直觀察到?就這樣吧。 –