2017-01-10 27 views
4

私は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(); 
    } 

答えて

4

に観察フェッチユーザーのためのコードです。各リフレッシュ時に新しいトークンを取得する必要がある場合:

private fetchTrigger = new BehaviorSubject(null); 

triggerFetch() { 
    this.fetchTrigger.next(); 
} 

fetch() { 
    this.userObservable = this.fetchTrigger 
    .switchMap(() => Observable.fromPromise(this.getToken())) 
    .switchMap(token => { 
     ... 
    }) 
    ... 
    .publishLast() 
    .refCount(); 
} 
+0

タイムアウト後にトークンがリフレッシュされるため、これはうまくいかないと思います。 Keycloak SSOを認証に使用しています。 –

+0

@Mohammad Umair Khan、答えを確認する –

+0

BehaviorSubjectは、API呼び出しが完了するのを待つのではなく、最初のサブスクリプションで初期化された値を返します。これは流れを壊しています、私は主題でしようとしていますが、運はまだありません。 –

関連する問題