我想在我的Angular服務中實現短期緩存 - 一組子組件快速連續創建,並且每個組件都有一個HTTP調用。我想在頁面加載時緩存它們,但不是永遠。share()vs ReplaySubject:哪一個,哪個都不能工作
我試過以下兩種方法,這兩種方法都沒有奏效。在這兩種情況下,對於創建的組件的每個實例,都會爲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 - 它們會返回相同的數據,並且在包含該組件的行的網格中,數據將是相同的。當網格本身被創建時,我可以調用,並將該數據傳遞給組件。但我想避免這種情況,原因有兩個:首先,組件應該相對自給自足。如果我在別處使用組件,我不希望父組件也必須在那裏緩存數據。其次,我想找到一個可以在應用程序中的其他地方應用的短期緩存模式。我不是唯一一個在這方面工作的人,我想保持代碼清潔。
我可能一直不清楚(我會用這個信息更新這篇文章),但'share()'和'RelaySubject()'代碼在服務中,而調用者代碼在組件中。 –