【发布时间】:2021-11-03 02:37:42
【问题描述】:
我有一个案例,我想缓存一个 http 响应,其中包含整个应用程序所需的大量数据并且不会改变(直到现在......因此问题......),因此我的直接想法是使用shareReplay,它的工作原理是在该会话的应用程序生命周期内无需多次获取同一组数据。很简单,声明一个变量,例如 allData$ 并在所需的组件中订阅它,例如服务:
allData$ = this.getAllData().pipe(shareReplay())
但是在一个组件中...我现在可以实际修改此端点返回的数据,例如添加一个新项目,因此我需要在这些情况下重新获取数据并再次缓存该数据新的回应。有没有很好的 rxjs 方法来做到这一点?我想做这样的事情,就像在“一个班轮”中只使用上面的单个 allData$ 变量。我现在所采用的方法对我来说似乎有点难看,添加一个新的 BehaviorSubject 和一个组件可以在需要更新此数据时调用的函数,即服务代码:
allData = new BehaviorSubject({} as MyModel);
allData$ = this.allData.asObservable();
constructor(private http: HttpClient) {
this.getAllData().subscribe();
}
// this is called by component, when the db has been modified and need to update allData
refetchData() {
this.getAllData().subscribe();
}
getAllData() {
return this.http.get<MyModel>('url').pipe(
// updating the stream...
tap(value => this.allData.next(value))
)
}
我确定有一个不错的 rxjs 运算符可以完成所有这些操作?
【问题讨论】: