我正在尝试在我的Angular服务中实现短期缓存 - 快速连续创建一堆子组件,每个子组件都有一个HTTP调用。我想在页面加载时缓存它们,但不是永远。
我尝试了以下两种方法,但两种方法都没有效果。在这两种情况下,对于创建的组件的每个实例,都会针对HTTP URL命中一次;我想避免这种情况 - 理想情况下,在创建网格时会触发一次URL,然后缓存过期,下次我需要创建组件时,它会再次点击URL。我从StackOverflow上的其他线程中提取了这两种技术。
分享()(在服务中)
getData(id: number): Observable<MyClass[]> {
return this._http.get(this.URL)
.map((response: Response) => <MyClass[]>response.json())
.share();
}
ReplaySubject(使用中)
private replaySubject = new ReplaySubject(1, 10000);
getData(id: number): Observable<MyClass[]> {
if (this.replaySubject.observers.length) {
return this.replaySubject;
} else {
return this._http.get(this.URL)
.map((response: Response) => {
let data = <MyClass[]>response.json();
this.replaySubject.next(data);
return data;
});
}
}
来电者(在组件中)
ngOnInit() {
this.myService.getData(this.id)
.subscribe((resultData: MyClass[]) => {
this.data = resultData;
},
(error: any) => {
alert(error);
});
}
每次创建组件时都没有必要点击URL - 它们返回相同的数据,并且在包含组件的行网格中,数据将是相同的。创建网格本身时,可以调用一次,并将该数据传递给组件。但我想避免这种情况,原因有二:首先,组件应该相对自给自足。如果我在其他地方使用该组件,我也不希望父组件也必须在那里缓存数据。其次,我想找到一个可以在应用程序的其他地方应用的短期缓存模式。我并不是唯一一个这样做的人,我想保持代码清洁。
答案 0 :(得分:3)
最重要的是,如果你想在创建/销毁Angular组件时做一些持久性的东西,它就不能在那个组件中创建,而是在你的组件之间共享的服务中创建。
关于RxJS,您通常不必直接使用ReplaySubject
,而只使用publishReplay(1, 10000)->refCount()
。
share()
运算符只是内部使用publish()->refCount()
的{{1}}的简写,这意味着它不会重播缓存的值。