首页 文章

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

提问于
浏览
5

我正在使用Angular 2中的Portal . 在登录时,我向服务器发出请求以获取登录的用户配置文件 . 获取用户配置文件的方法返回一个observable,它在应用程序加载时在6个不同的位置订阅 .

如果我使用了cold observable,这将导致对服务器的6个API调用 . 所以我通过添加.publishLast() . refCount()切换到热观察 .

这导致单个请求共享数据,因为用户配置文件不会在后续请求中更新 .

The problem starts here:

现在我有一个编辑配置文件功能,它通过HTTP PUT更新用户配置文件,因此,我想使先前订阅的Observables到期并以某种方式再次触发序列,以便再次执行API并且订阅接收更新的数据 .

有什么方法可以重新启动/重新触发已订阅的可观察序列吗?

这是fetch用户可观察的代码

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

1 回答

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

相关问题