2017-01-10 128 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调用完成。这是打破流动,我想与主题,但没有运气呢。 –