我以前见过这个问题,但我的回答总是让我不满意,所以我会尽量准确地说:
我正在使用https://www.npmjs.com/package/rxjs,并希望对许多http请求进行排队,并且我希望将这些请求链接到其他操作中,比如:
urls$.flatMap(x => fetchUrls(x)).subscribe(x => console.log(x));url$是可观测的,fetchUrls是返回新可观测值的方法。这将很好地工作,除非从urls$开始的第一个流非常快,而且fetchUrls方法很慢(执行http请求/响应)。最后,我会立即运行200+ http请求。
我认为将200+挂起的http请求留在客户机上是自找麻烦,所以我想以某种方式将请求合并起来,并且我读到在使用mergeMap/flatMap时设置最大并发请求是可能的,这真的很好。
我为这里的内容创建了一个游乐场:http://www.webpackbin.com/EkQXtBEwz,我有一个名为fakeHttpLookup的方法,它将响应延迟一秒钟,并向它提供一个包含200个urls的列表--如果按顺序运行将需要200秒。如果将maxConcurrent设置为5,最好的情况是在40秒内处理整个流。
问题是-我不能让它起作用。它确实需要前5,但之后停下来。它永远不会完成整个小溪。
我希望看到计数器的增量,每秒钟5次,一次显示5个并发http请求。
有人能帮忙吗?我可以一次只运行一个请求--我可以一次缓冲其中的5个请求,但重要的是不要一次排完所有200个请求--或者只接受前几个请求。
TLDR:我希望能够对http请求进行队列/池,并且流必须能够限制请求的数量,而不需要在硬编码的等待延迟时猜测。
发布于 2017-01-27 14:19:31
.flatMap(),又名.mergeMap(),有一个可选的参数“并发”
mergeMap(项目:函数(值: T,?索引:数字):可观察的,resultSelector:函数(outerValue: T,innerValue: I,outerIndex: number,innerIndex: number):任意,并发: number)
因此,这只是一个简单的问题:
function fetch(id) {
return Rx.Observable.of(id)
.do(i => console.log(`fetching request ${i}`))
.delay(2 * 1000);
}
Rx.Observable.range(1, 20)
.flatMap(id => fetch(id), null, 5)
.subscribe(console.log);<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>
执行5个并发请求
https://stackoverflow.com/questions/41895853
复制相似问题