Javascript 如何在RXJS中实现背压轮询
我想轮询一个响应速度较慢的HTTP API,因此我不想同时对此API进行多个调用 我想做的一个例子是:Javascript 如何在RXJS中实现背压轮询,javascript,rxjs,observable,reactive-programming,Javascript,Rxjs,Observable,Reactive Programming,我想轮询一个响应速度较慢的HTTP API,因此我不想同时对此API进行多个调用 我想做的一个例子是: const interval = Rx.Observable.interval(250).take(5); // Poll every 250ms function simulateMaybeSlowHttpCall() { return interval.delay(500).take(1); // The service takes 500ms to answer } inter
const interval = Rx.Observable.interval(250).take(5); // Poll every 250ms
function simulateMaybeSlowHttpCall() {
return interval.delay(500).take(1); // The service takes 500ms to answer
}
interval
.mergeMap(val =>simulateMaybeSlowHttpCall().map(x => val), 1) // max concurrent is 1
.subscribe(val => console.log(val));
在此,将显示此代码
1.
2.
3.
4.
五,
但我不想打没用的电话。
上面的代码运行时间为250*5=1250毫秒,1次呼叫需要500毫秒,因此我想显示:
一,
3.
五,
所以我的问题是:当将concurrent设置为1
(或任何其他值)时,如何放弃所有未立即完成的调用
jsidle:使用并发性为1的
mergeMap
相当于concatMap
。事实上,就是这样。这就是为什么示例中的每个间隔都会影响HTTP请求:它们是排队的
如果希望避免在HTTP请求挂起时启动或排队,可以使用:
当使用
defaustmap
时,它接收到的任何下一个通知都将被忽略,直到内部可观察(HTTP请求)完成。这听起来像是一种您应该使用而不是mergeMap
的情况。它似乎满足了我的要求。你能把它贴出来作为答案吗?那样我会把它标记为已接受?
interval
.exhaustMap(val => simulateMaybeSlowHttpCall().map(x => val))
.subscribe(val => console.log(val));