我发现了许多缓存反应式可观察量的方法,更具体地说,是http请求的结果.但是,由于以下原因,我对提议的解决方案并不完全满意:
1.此答案/sf/answers/2549206831/使用私有字段存储第一个请求的结果,并在所有后续调用中重用它.
代码:
private data: Data;
getData() {
if(this.data) {
return Observable.of(this.data);
} else {
...
}
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,可观察力的力量完全被忽略了 - 你手动完成所有的东西.事实上,如果我对将结果分配给局部变量/字段感到满意,我就不会寻找合适的解决方案.我认为一个不好的做法的另一个重要的事情是服务不应该有一个状态 - 即应该没有包含从一个调用到另一个调用的数据的私有字段.清除缓存相当容易- 只需将this.data设置为null,即可重新执行请求.
2.这个答案/sf/answers/2548910241/建议使用ReplaySubject:
private dataObs$ = new ReplaySubject(1);
constructor(private http: Http) { }
getData(forceRefresh?: boolean) {
// If the Subject was NOT subscribed before OR if forceRefresh is requested
if (!this.dataObs$.observers.length || forceRefresh) {
this.http.get('http://jsonplaceholder.typicode.com/posts/2').subscribe(
data => this.dataObs$.next(data),
error => {
this.dataObs$.error(error);
// Recreate the Observable as after Error we …Run Code Online (Sandbox Code Playgroud)