使用Observables进行限制函数调用

时间:2018-03-16 07:59:04

标签: javascript angular rxjs observable throttling

我正在尝试编写一个以受限制的方式处理HTTP请求的Angular服务。该服务提供了一个函数myFunction(),每隔 x 毫秒应调用一次。 myFunction()进行HTTP调用并返回一个observable。但是,URL(准确的URL的GET参数)是可变的,并且可能会在多次调用myFunction()期间发生变化。

为简单起见,我们假设myFunction()返回服务的私有变量 v 的值。这个变量可以随时间变化:

v=1   v=2   v=4   v=3   v=1
----x-x--x|---x----x--|---x-----x-|---
          |-t1        |-t2        |-t3

x标记了myFunction()被调用的时间。它应该只在标有|的时间返回一个值。所有其他呼叫应该延迟到此时间并返回最后一个值。因此,myFunction()的前3个调用将在t1之后返回v = 2,接下来的两个调用将在t2之后返回v = 3,最后两个将在t3之后返回v = 1。

我尝试过这些方法,但没有取得任何成功:

myFunction() {
  return Observable.create(obs => {
    obs.next(this.v);
  }).pipe(throttle(val => interval(x)));
}

拨打myFunction()会立即返回 v 的值,不会有任何延迟。

更新 澄清用例。呼叫myFunction()返回给定ID的数据,例如myFunction(1)返回{id: 1, data: 'foo'}myFunction(2)返回{id: 2, data: 'bar'}。此数据由提供信息的后端端点检索。后端端点接受任意数量的ID并返回数据映射。我想要实现的是以受限制的方式联系后端。如果前端服务被调用一次,它应该等待一段时间并检查是否有其他请求进入。这些ID是在私有变量中收集的。在此期间,这些电话都在阻塞。一旦给定的延迟过去,服务就会将后端与当前的ID列表联系起来。之后,将解析返回的数据映射,并且每次调用myFunction()都会返回相应的数据。然后,重置服务的内部ID映射并重新启动孔过程。如果没有调用myFunction(),则不应调用后端。希望使用例更清晰......

1 个答案:

答案 0 :(得分:0)

有些喜欢?

export class Service {
  variable:any;  //this variable change anyway
  constructor(private http: Http) { }

  timer = Observable.timer(0, 1000);  //create a observable "timer"

  getNewValue = () => {
    return this.timer
      .flatMap(() => this.http.get("url"+/this.variable))
  }
}

Rebasing a Git merge commit