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

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)

  • @siva636我明白你在这里做什么,但是你能告诉我你的方法比简单地在你的服务中管道传输http.get并提取数据并将其放入服务中的不可观察变量中的好处吗? (4认同)
  • 是的,我每次都创建一个新的可观察对象.....这是我的错误。Tnx。)。漫长的一天... (2认同)
  • 仍在等待答复 (2认同)

小智 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)