我创建了一个演示(ng-run),其中有一个调用Http请求的按钮。
单击按钮时,我将调用此方法:
com.android.support:support-v4:24.0.0
从服务中依次调用此内容:
public getData(){
this._jokeService.getData().subscribe();
}
问题在于每次点击-我仍然看到启动了一个新的http请求:
问题:
为什么不使用shareReplay保留响应的最后一个值?
如何使我的代码仅调用一次http并将该值保留给以后的订阅?
答案 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"