我想使用向服务器发出一系列请求,但是服务器的硬速率限制为每秒10个请求。如果我尝试循环发出请求,那么它将达到速率限制,因为所有请求都将同时发生。
for(let i = 0; i < 20; i++) {
sendRequest();
}
Run Code Online (Sandbox Code Playgroud)
ReactiveX有很多用于修改可观察流的工具,但是我似乎找不到实现速率限制的工具。我尝试添加标准延迟,但请求仍同时触发,仅比之前晚100ms。
const queueRequest$ = new Rx.Subject<number>();
queueRequest$
.delay(100)
.subscribe(queueData => {
console.log(queueData);
});
const queueRequest = (id) => queueRequest$.next(id);
function fire20Requests() {
for (let i=0; i<20; i++) {
queueRequest(i);
}
}
fire20Requests();
setTimeout(fire20Requests, 1000);
setTimeout(fire20Requests, 5000);
Run Code Online (Sandbox Code Playgroud)
在debounceTime和throttleTime运营商都相似,我正在寻找为好,但是这是不是无损有损。我想保留我提出的每个请求,而不是丢弃先前的请求。
...
queueRequest$
.debounceTime(100)
.subscribe(queueData => {
sendRequest();
});
...
Run Code Online (Sandbox Code Playgroud)
如何使用ReactiveX和Observables向服务器发出这些请求而又不超过速率限制?