私はAngular 2のポータルで作業しています。ログインすると、ログインしたユーザープロファイルを取得するようにサーバーに要求します。ユーザープロファイルを取得するメソッドは、アプリケーションが読み込まれるときに6つの異なる場所でサブスクライブされるobservableを返します。RxJSでホット観測可能なシーケンスをリフレッシュ/リロードする
私がcold observableを使用した場合、サーバーへの6回のAPIコールが発生します。だから私は.publishLast()。refCount()を追加することで注目の観測に切り替えました。
これにより、後続のリクエストでユーザープロファイルが更新されないため、データを共有する単一の要求が発生しました。
問題はここから:
は、今私は、HTTP PUTを経由して、その結果として、ユーザ・プロファイルを更新[プロファイルの編集機能を持って、私は以前に何とか観測を購読し、トリガーを期限切れにしたいと思いますそのシーケンスは再びAPIが再び実行され、サブスクリプションは更新されたデータを受信します。
既に購読されている観測可能なシーケンスを再起動/再トリガできる方法はありますか?このサンプルtoken
に一度だけ検索されたことを
private fetchTrigger = new BehaviorSubject(null);
triggerFetch() {
this.fetchTrigger.next();
}
fetch() {
this.userObservable = Observable
.combineLatest(
Observable.fromPromise(this.getToken()),
this.fetchTrigger
)
.switchMap(([token]) => {
...
})
...
.publishLast()
.refCount();
}
注:ここでは
はあなたがフェッチトリガするsubject
を導入しようとすることができます
fetch(){
this.userObservable = Observable.fromPromise(this.getToken())
.switchMap(token => {
let headers = new Headers();
headers.append('Authorization', `Bearer ${token}`);
return this.http.get('/api/v1/admin/users/me?includes=role', {headers: headers})
})
.map((res: Response) => {
let retVal: any = {
data: new Deserializer({
keyForAttribute: 'camelCase'
}).deserialize(res.json())
};
this.user = retVal.data as MpUser;
this.user.role = MpRoles[retVal.data.role[0].name];
return this.user;
})
.publishLast()
.refCount();
}
タイムアウト後にトークンがリフレッシュされるため、これはうまくいかないと思います。 Keycloak SSOを認証に使用しています。 –
@Mohammad Umair Khan、答えを確認する –
BehaviorSubjectは、API呼び出しが完了するのを待つのではなく、最初のサブスクリプションで初期化された値を返します。これは流れを壊しています、私は主題でしようとしていますが、運はまだありません。 –