在Angular中使用shareReplay(1)-仍会调用http请求吗?

时间:2018-06-26 13:37:46

标签: javascript angular rxjs rxjs6

我创建了一个演示(ng-run),其中有一个调用Http请求的按钮。

单击按钮时,我将调用此方法:

com.android.support:support-v4:24.0.0

从服务中依次调用此内容:

public getData(){
 this._jokeService.getData().subscribe();
}

问题在于每次点击-我仍然看到启动了一个新的http请求:

enter image description here

问题:

为什么不使用shareReplay保留响应的最后一个值?
如何使我的代码仅调用一次http并将该值保留给以后的订阅?

编辑:solution is here

2 个答案:

答案 0 :(得分:6)

如果您每次致电this.http.get(API_ENDPOINT).pipe(shareReplay(1)),则每次都会触发http请求。如果要进行一次HTTP调用并缓存数据,建议执行以下操作。

您首先获得可观察的数据:

 ngOninit(){
    this.data$ =  this._jokeService.getData().pipe(shareReplay(1));
    }

现在订阅多次:

 public getData(){
     this.data$.subscribe();
    }

您的服务:

public getData() {
    return this.http.get(API_ENDPOINT)
  }

答案 1 :(得分:0)

在使用中:

getData$ = this.http.get(API_ENDPOINT).pipe(shareReplay(1));

在组件中,需要取消订阅,并且可以通过单个API调用多次订阅:

ngOninit(){
   this.data$ =  this._jokeService.getData$;
   this.data$.subscribe() 
}

在模板中,使用:

*ngIf="data$ | async as data"