簡體   English   中英

使用 RxJS 刷新/重新加載 Hot Observable 序列

[英]Refresh/reload a Hot Observable sequence with RxJS

我正在 Angular 2 中開發一個 Portal。在登錄時,我向服務器發出請求以獲取登錄的用戶配置文件。 獲取用戶配置文件的方法會返回一個 observable,當應用程序加載時,它會在 6 個不同的地方訂閱。

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

這導致單個請求共享數據,因為用戶配置文件不會在后續請求中更新。

問題從這里開始:

現在我有一個編輯配置文件功能,它通過 HTTP PUT 更新用戶配置文件,因此,我想使之前訂閱的 Observable 過期並以某種方式再次觸發序列,以便再次執行 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();
  }

你可以嘗試引入subject來觸發fetch:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM