我正在尝试在我的Angular服务中实现短期缓存 - 多个子组件会快速创建,每个子组件都有一个HTTP调用。 我想在页面加载时缓存它们,但不是永久的。
我尝试了以下两种方法,但都没有起作用。 在这两种情况下,HTTP URL每创建一个组件实例就会被访问一次; 我想避免这种情况 - 理想情况下,在创建表格时会访问一次URL,然后缓存过期,下次需要创建组件时会重新访问URL。 我从StackOverflow的其他线程中提取了这两种技术。
share()(在服务中)
我尝试了以下两种方法,但都没有起作用。 在这两种情况下,HTTP URL每创建一个组件实例就会被访问一次; 我想避免这种情况 - 理想情况下,在创建表格时会访问一次URL,然后缓存过期,下次需要创建组件时会重新访问URL。 我从StackOverflow的其他线程中提取了这两种技术。
share()(在服务中)
getData(id: number): Observable<MyClass[]> {
return this._http.get(this.URL)
.map((response: Response) => <MyClass[]>response.json())
.share();
}
ReplaySubject (in service)
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()
的代码是在服务中,而调用者的代码是在组件中。 - Ari Roth