我有医生的服务,并且具有如下所示的API调用
patientDetails():Observable<any>
{
return http.get("/home/patient-details")
}
以上服务我正在订购不同的模块组件以获取患者详细信息。在这里,我在考虑如何防止在多个组件中调用重复的API?
是否可以选择仅调用一次API并在项目之间共享数据
答案 0 :(得分:1)
HttpClient
的方法返回可观察的冷。要获得所需的功能,您需要可观察的热。您可以使用shareReplay(numberOfEventsToShare)
将冷的可观测转换为热的可观测(由于变暖也称为温暖的可观测)并将其存储在属性中。要了解为什么需要此运算符,您需要知道什么表示Observable是热或冷。看看这个great article。
但是对于您的情况而言简而言之: Hot Observable 共享一个生产者,该生产者甚至可以在有人订阅他之前就产生价值。另一方面,冷可观察为每个观察者创建生产者(这意味着状态不会在不同观察者之间共享)。
因此,shareReplay(1)
运算符将通过共享源并为所有观察者(也为将来的观察者)重放1个事件,使HttpClient
温暖地返回可观察的状态。
我创建了一个StackBlitz demo,您可以看到即使添加了新组件之后也没有后续的HTTP请求。
答案 1 :(得分:0)
December 31, 2014 to 2014-12-31
May 31 , 2018 to 2018-05-31
答案 2 :(得分:0)
我相信提供的答案Bardr
和that_guy
都要求在服务启动时进行API调用(因为它们是在构造函数中调用的)。
我想对多个组件进行非重复的API调用,但前提是任何组件都需要该调用。因此,它不能依赖于构造函数。我决定以以下方式实现它,其中检查可观察的后备的值,并且仅当可观察的后备的值为null时才调用API。可以将这种模式与以上答案结合起来。
为我服务:
private foobarReference = new BehaviorSubject<FoobarReference>(null);
public foobarReference$ = this.foobarReference.asObservable();
public getFoobarReferences(): Observable<FoobarReference> {
if (this.foobarReference.getValue() == null) {
this.httpClient.get<FoobarReference>('/api/references/foobar/').subscribe(data => this.foobarReference.next(data));
}
return this.foobarReference$;
}
在组件中,我像其他可观察对象一样订阅它(我使用takewhile,因为可观察对象在服务有效期内不会改变值):
private this.foobarReferences: FoobarReference;
this.foobarService.getFoobarReferences().pipe(takeWhile(x => x == null, true)).subscribe(data => this.foobarReferences = data);