我正在尝试编写一个以受限制的方式处理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()
,则不应调用后端。希望使用例更清晰......
答案 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))
}
}