2017-01-10 131 views
4

我正在Angular 2中的Portal上工作。登錄時,我向服務器發出請求以獲取登錄的用戶配置文件。提取用戶配置文件的方法將返回一個在應用程序加載時在6個不同位置預訂的observable。使用RxJS刷新/重新加載Hot Observable序列

如果我用了一個寒冷的觀察到的,這會導致6 API調用到服務器。所以我通過添加.publishLast()。refCount()來切換到一個熱門的observable。

這導致了一個請求共享數據,因爲用戶的個人資料不會在後續請求更新。

問題從這裏開始:

現在我有一個編輯個人資料功能,它通過HTTP PUT和作爲一個結果更新用戶配置文件,我想到期之前訂閱觀測量並以某種方式觸發該序列再次使API再次執行,並且訂閱接收更新的數據。

有沒有一些方法,我可以重新啓動/重新觸發一個已經訂閱可觀察序列?

下面是獲取用戶可觀察

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

你可以嘗試引入subject觸發獲取代碼:

private fetchTrigger = new BehaviorSubject(null); 

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

fetch() { 
    this.userObservable = Observable 
    .combineLatest(
     Observable.fromPromise(this.getToken()), 
     this.fetchTrigger 
    ) 
    .switchMap(([token]) => { 
     ... 
    }) 
    ... 
    .publishLast() 
    .refCount(); 
} 

注意,此示例中token檢索只有一次。如果您需要在每次刷新時獲取新令牌:

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調用完成。這是打破流動,我想與主題,但沒有運氣呢。 –