【发布时间】:2018-12-05 06:11:32
【问题描述】:
我创建了一个演示 (ng-run),其中有一个调用 Http 请求的按钮。
当按钮被点击时,我调用这个方法:
public getData(){
this._jokeService.getData().subscribe();
}
这反过来调用它(从服务):
public getData() {
return this.http.get(API_ENDPOINT).pipe(shareReplay(1))
}
问题是每次点击时 - 我仍然看到发起了一个新的 http 请求:
问题:
为什么 shareReplay 不保留响应的最后一个值?
如何让我的代码只调用一次 http 并保留该值以供将来订阅?
【问题讨论】:
-
为什么不会你看到一个新的请求?你又打电话给
http.get了!shareReplay可防止返回的 observable 的其他订阅者触发新响应,但您每次都在创建一个新响应。如果您想发出单个请求,则将现有值公开给未来的订阅者使用ReplaySubject,正如我在这里展示的那样:stackoverflow.com/a/41554338/3001761。然后,您可以区分触发新请求和请求现有值,加上如果您确实需要发出额外请求,所有现有订阅者都会在可用时收到新结果。 -
我认为我不需要创建一个中间
ReplaySubject来保持这些值。恕我直言 - 没有它也可以完成。 -
是的,没有它也可以完成,只要你只想要一个值。但是您仍然需要存储和公开一个可观察对象,不要每次都创建一个新对象。
-
是的,这是我的愚蠢错误。我每次都创建一个新的可观察对象(发生)
-
我写了一个库 ngx-RxCache github.com/adriandavidbrand/ngx-rxcache 来帮助你在 Angular 中管理这样的事情。在这里阅读它medium.com/@adrianbrand/…
标签: javascript angular rxjs rxjs6