首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用RxJS和Angular2限制并发http请求

使用RxJS和Angular2限制并发http请求
EN

Stack Overflow用户
提问于 2017-01-27 14:07:21
回答 1查看 4K关注 0票数 2

我以前见过这个问题,但我的回答总是让我不满意,所以我会尽量准确地说:

我正在使用https://www.npmjs.com/package/rxjs,并希望对许多http请求进行排队,并且我希望将这些请求链接到其他操作中,比如:

代码语言:javascript
运行
复制
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请求进行队列/池,并且流必须能够限制请求的数量,而不需要在硬编码的等待延迟时猜测。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-27 14:19:31

.flatMap(),又名.mergeMap(),有一个可选的参数“并发”

mergeMap(项目:函数(值: T,?索引:数字):可观察的,resultSelector:函数(outerValue: T,innerValue: I,outerIndex: number,innerIndex: number):任意,并发: number)

因此,这只是一个简单的问题:

代码语言:javascript
运行
复制
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);
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>

执行5个并发请求

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41895853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档