如何防止多次呼叫同一端点

时间:2019-01-30 09:13:18

标签: angular typescript rxjs observable

我在两个单独的组件中两次调用方法loadParticipant,尽管将Observable保存在变量中,但几乎同时执行了两次,api被多次调用。该解决方案在AngularJs和Promises调用中有效,但是现在我当然想使用Observables:)

我试图在地图后添加去抖动时间并共享参数

return (this.loadParticipantObservable = this.sharedEndpoints.getParticipant().map((response) => {
    this.loadParticipantObservable = null;
    return (this.participant = response);
})).share().debounceTime(1000);

loadParticipant方法的实际代码

public loadParticipant(): Observable<DTO<PersonModel>> {
    if (this.participant) {
        return new BehaviorSubject<DTO<PersonModel>>(this.participant);
    }

    if (this.loadParticipantObservable) {
        return this.loadParticipantObservable;
    }

    return (this.loadParticipantObservable = 
        this.sharedEndpoints.getParticipant().map((response) => {
            this.loadParticipantObservable = null;
            return (this.participant = response);
        }));
    }

示例我如何调用loadParticipant方法

this.sharedService.loadParticipant().subscribe((response: DTO<PersonModel>) => {
            ...
     });

同时,Observable不为null,代码处于这种情况并执行

 return this.loadParticipantObservable;

我将其检入调试器。

这只是我可以观察到的回报,但不幸的是,这段代码调用的代码更低,这从后端调用了真正的端点

1 个答案:

答案 0 :(得分:0)

如果我不满意,我会尝试将获取可视化逻辑分为两种,换句话说,可以使用两种方法进行服务:

  • 方法I从后端

  • 用于检索和保存客户端上的数据(在服务内部的变量中)。
  • methodII为了从组件中获取数据(从上述变量中​​获取),

此后,我将在需要可视化所需数据的任何地方订阅methodII,将在最近的公共父级组件中调用服务器。

看看这个 rxjs 演示CodeSandbox,我认为它将帮助您了解我在说的事情:)

**注意:如果您可以负担得起,可以使用rxjs 5.5+,因为您将能够使用可管道运算符,这带来了一些好处,您可以在主题Pipeable operators article上查看一下

>

**注2:如果您正在处理中型或大型项目,请检查ngrx,因为使用ngrx,与服务器调用和UI状态管理相关的所有麻烦都将消失。