【发布时间】:2017-06-22 00:14:05
【问题描述】:
在我的 Angular2 设置中,我有一个调用服务方法的组件。 service 方法返回一个 Observable 并且组件订阅它。
由于我希望服务缓存最近的调用,我会使用 map 函数拦截 Observable 中的数据。示例服务方法如下所示
provideData():Observable<Data> {
return this.http.get(url).
map(resp => resp.json()).
map(data => {
this.cachedData = _.cloneDeep(data);
return data;
}
}
这种方法对我有用,但是,我不确定我是否没有滥用不映射任何内容的 map 函数。它只是一个拦截数据的拦截器。有没有更好或更推荐的方法?
PS.:这不一定是关于缓存,而不是在非映射操作中适当使用 map 函数。 In this question Günter 得到广泛认可的答案实际上做了同样的事情,并为此使用了 map。另一方面,用户 olsn 在 cmets 中表示 do 会更合适。
【问题讨论】:
-
@GünterZöchbauer 很高兴看到您在利用地图功能执行缓存方面基本上做了同样的事情。看来这是要走的路。
-
不要使用
map,而是使用do-运算符,这样您就不必添加返回语句 -
既然您在哪里要求“缓存数据”,我宁愿不要将其视为“有效答案”,因为这不是一个很好的做法,当您想要缓存数据时,您应该使用
replayLast().refCount() -
在问题被标记为重复之前,我没有时间发布答案。但是,是的,
do应该用于您的要求。不,在这种情况下当然不应该使用它,因为它是 XY 问题。cachedData是开发人员对可观察对象不够满意的标志。这个问题可以用惯用的方式来解决,正如在 dupe question 中所显示的那样。
标签: angular dictionary rxjs observable interceptor