【问题标题】:RxJS Ab(using) map function of Observables [duplicate]Observables的RxJS Ab(使用)映射功能[重复]
【发布时间】: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


【解决方案1】:

PublishReplay 使您的流多播兼容并缓存源流。

provideData():Observable<Data> {
  return this.http.get(url)
    .map(resp => resp.json())
    .publishReplay();
}

有关此运算符如何工作的详细说明,请查看Making a lazy, cached observable that only execute the source once

【讨论】:

  • 嘿,马克。感谢您的回答。正如问题线程中所讨论的那样,我正在寻找类似do 函数的东西。但是,显然,尤其是出于缓存目的,您的建议绝对有效。我会仔细阅读的。
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多