我希望缓存特定Angular2 HTTP调用的结果(从服务器获取我的用户配置文件),并且我希望该缓存在更新配置文件之前保持有效。
这是我的代码,它会缓存值,但永远不会更新它,即使配置文件已更改。
readonly user$: Observable<User> = this.http
.get(`${this.baseUrl}/me`)
.map(r => r.json())
.publishLast()
.refCount();
updateProfile(user: User): Observable<any> {
return this.http.put(`${this.baseUrl}/me`, user);
// cause the existing user$-subscriptions to update with the user value
}
我希望个人资料更新现有订阅,并将user
值传递给updateProfile
。这可以用Rx-y方式很好地完成,还是我不得不求助于使用Subject
并手动更新?
答案 0 :(得分:0)
我显然距离答案只有几分钟的路程。一个可行的解决方案似乎是为用户更新创建Subject
。
将该主题与HTTP observable合并(强制只执行一次)。然后,在更新时,将新的user
值放入主题中。这将获得初始HTTP请求,然后是缓存响应。
private readonly userSubject = new Subject<User>();
readonly user$: Observable<User> = this.userSubject
.merge(this.http
.get(`${this.baseUrl}/me`)
.map(r => r.json())
.publishLast()
.refCount()
);
updateProfile(user: User): Observable<any> {
return this.http.put(`${this.baseUrl}/me`, user)
.map(r => r.json())
.do(() => this.userSubject.next(user));
}
任何更优雅的方法都将受到高度赞赏。 :)