rxjs http请求未缓存

时间:2018-02-28 07:50:04

标签: angular rxjs observable

我试图理解rxjs publishReplayrefCountshare 我想要实现的是缓存http请求,如What is the correct way to share the result of an Angular Http network call in RxJs 5?

所述

这是我想出的

export class TestService {

  constructor(private http: HttpClient) {}
  getData(): Observable<any> {
    return this.http.get('https://httpbin.org/anything').map((data: any) => {
    console.log('getting data');

      return Math.floor(Math.random() * 20);
    }).publishReplay(1).refCount();
  } 
}

调用它

t.getData().subscribe((data: any) => console.log(data));
t.getData().subscribe((data: any) => console.log(data));

请求通常会进行两次。

只是为了解释原因:

我是否更正了如果我第二次订阅时observable(http请求)还没有完成,会发生这种情况吗?

如果我在第一个订阅中移动第二个t.getData(),则只有一个请求是模式。

here is a stackblitz with the code

1 个答案:

答案 0 :(得分:1)

每次调用方法getData()时,它都会返回一个新的可观察对象 - 将冷可观察对象转换为热可观察对象并不重要。

更合适地使用.publishReplay是为了保持Observable的相同实例。

例如:

export class TestService {
  data: Observable<any>;
  constructor(private http: HttpClient) {
     this.data = this.getData();
  }
  getData(): Observable<any> {
    return this.http.get('https://httpbin.org/anything').map((data: any) =>{
    console.log('getting data');

      return Math.floor(Math.random() * 20);
    }).publishReplay(1).refCount();
  } 
}

致电:

this.data.subscribe(t=> ...);
this.data.subscribe(t=> ...);