如何防止在不同组件中调用相同的api

时间:2019-03-06 01:50:20

标签: angular

我有医生的服务,并且具有如下所示的API调用

patientDetails():Observable<any>
 {
   return http.get("/home/patient-details")
 }

以上服务我正在订购不同的模块组件以获取患者详细信息。在这里,我在考虑如何防止在多个组件中调用重复的API?

是否可以选择仅调用一次API并在项目之间共享数据

3 个答案:

答案 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)

我相信提供的答案Bardrthat_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);