执行一次HTTP调用并缓存值,直到某些条件发生变化

时间:2017-03-19 19:39:04

标签: angular rxjs reactive-extensions-js

我希望缓存特定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并手动更新?

1 个答案:

答案 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));
}

任何更优雅的方法都将受到高度赞赏。 :)