2017-08-25 3 views
0

私は角度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のサブスクリプションのリストをキャッシュすることができるので、の代わりにsubscriptionService.isSubscribed(programId)booleanを返すようにしたいので、毎回サーバーを呼び出す必要はありません。私はそれがプログラミングの課題を変えるとは思わない。

答えて

0

canActivate機能がObservable<boolean>を返すことができます扱うことができます。

+0

Ha、Observablesが一番上にありますか?それで。 –

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; 
     } 
    }); 
} 
関連する問題