私は角度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
を返すようにしたいので、毎回サーバーを呼び出す必要はありません。私はそれがプログラミングの課題を変えるとは思わない。
Ha、Observablesが一番上にありますか?それで。 –