Roy*_*mir 8 javascript rxjs angular rxjs6
我创建了一个演示(ng-run),其中有一个调用Http请求的按钮。
当单击按钮时,我调用此方法:
public getData(){
this._jokeService.getData().subscribe();
}
Run Code Online (Sandbox Code Playgroud)
依次调用此(从服务):
public getData() {
return this.http.get(API_ENDPOINT).pipe(shareReplay(1))
}
Run Code Online (Sandbox Code Playgroud)
问题在于每次点击-我仍然看到启动了一个新的http请求:
题:
为什么shareReplay不保留响应的最后一个值?
如何使我的代码仅调用一次HTTP并保留该值以备将来使用?
编辑:解决方案在这里
siv*_*636 14
如果您每次调用this.http.get(API_ENDPOINT).pipe(shareReplay(1)),每次都会触发http请求。如果要进行一次HTTP调用并缓存数据,则建议执行以下操作。
您首先获得可观察的数据:
ngOninit(){
this.data$ = this._jokeService.getData().pipe(shareReplay(1));
}
Run Code Online (Sandbox Code Playgroud)
现在多次订阅:
public getData(){
this.data$.subscribe();
}
Run Code Online (Sandbox Code Playgroud)
您的服务:
public getData() {
return this.http.get(API_ENDPOINT)
}
Run Code Online (Sandbox Code Playgroud)
小智 6
在役:
getData$ = this.http.get(API_ENDPOINT).pipe(shareReplay(1));
Run Code Online (Sandbox Code Playgroud)
在组件中,需要取消订阅,您可以通过单个 API 调用多次订阅:
ngOninit(){
this.data$ = this._jokeService.getData$;
this.data$.subscribe()
}
Run Code Online (Sandbox Code Playgroud)
在模板中,使用:
*ngIf="data$ | async as data"
Run Code Online (Sandbox Code Playgroud)