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

2024-03-24

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

我在用着https://www.npmjs.com/package/rxjs https://www.npmjs.com/package/rxjs想要对大量的 http 请求进行排队,并且我想将它们链接到其他操作中,如下所示:

urls$.flatMap(x => fetchUrls(x)).subscribe(x => console.log(x));

url$ 是一个 Observable,而 fetchUrls 是一个返回新 Observable 的方法。这会工作得很好,除了来自 urls$ 的第一个流非常快并且 fetchUrls 方法很慢(执行 http 请求/响应)。我最终同时运行了 200 多个 http 请求。

我认为在客户端上留下 200 多个待处理的 http 请求会带来麻烦,所以我想以某种方式集中这些请求,并且我读到可以在使用时设置最大并发请求mergeMap http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeMap/flatMap,这真的很好。

我在这里为这个东西创建了一个游乐场:http://www.webpackbin.com/EkQXtBEwz http://www.webpackbin.com/EkQXtBEwz我有一个名为 fakeHttpLookup 的方法,它将响应延迟一秒,并为其提供 200 个 url 列表 - 如果按顺序运行将需要 200 秒。我猜想,当 maxConcurrent 设置为 5 时,最好的情况是它会在 40 秒内处理整个流。

问题是 - 我无法让它工作。它确实需要前 5 个,但随后停止。它永远不会完成整个流。

我希望看到计数器每经过一秒就会增加 5,说明一次有 5 个并发 http 请求。

有人可以帮忙吗?我可以忍受一次只运行一个请求 - 我可以一次缓冲 5 个请求,但这里重要的是不要一次排队所有 200 个请求 - 或者只获取前几个请求。

总而言之: 我希望能够对 http 请求进行排队/池化,并且流必须能够限制请求数量,而无需猜测硬编码的等待延迟。


.flatMap(), aka .mergeMap() http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeMap有一个可选参数“并发”

mergeMap(项目:函数(值:T,?索引:数字):Observable,resultSelector:函数(outerValue:T,innerValue:I,outerIndex:数字,innerIndex:数字):任何,并发:数量)

所以这只是一个问题:

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 个并发请求

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 RxJS 和 Angular2 限制并发 http 请求 的相关文章

随机推荐

  • 使用本地主机时 GuzzleHttp 挂起

    这是一个简单的代码片段 但这只是挂起并且没有响应 httpClient new GuzzleHttp Client version 6 x headers X API KEY gt 123456 request httpClient gt
  • VisualSVN Server:使用 svnadmin 工具进行备份

    我已经在 Windows Server 2008 上安装了 VisualSVN Server 我尝试使用 svnadmin 工具创建热复制备份 我好像没有安装这个工具 C gt svnadmin hotcopy C Repositories
  • 使用 Google Cloud DataFlow python sdk 读取一组 xml 文件

    我正在尝试从 GCS 存储桶读取 XML 文件的集合并处理它们 其中集合中的每个元素都是代表整个文件的字符串 但我找不到关于如何完成此操作的合适示例 我也无法理解它来自 Apache Beam 文档 主要是关于 Java 版本的 我当前的管
  • 数据库项目未运行部署后脚本

    我们有一个包含三个数据库项目的解决方案 所有三个生成的 dacpac 均按顺序部署 但由于某种原因 其中一个 dacpac 不运行部署后脚本 我们使用 sqlpackage 创建 diffscript 并且 diffscriptdoes正确
  • 使用角度2显示图像

    我对 Angular 2 很陌生 我被困在这里 我必须显示我正在使用相对路径的图像 img src images publicVideo1 PNG 但出现以下错误 null 1 GET http localhost 4200 null 40
  • 从批处理文件中读取和写入 REG_DWORD

    我的要求是从注册表中读取 REG DWORD 并将其写入另一个位置 我已成功从注册表位置读取数据 但不知道如何写入 My code echo off REG QUERY HKEY LOCAL MACHINE SOFTWARE Microso
  • XLL Excel Addin 的基础知识 - 需要从 Excel 调用 C# API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对创建 Excel 插件还很陌生 早些时候 我曾经为 NET 库创建一个 tlb 我曾经使我的 NET 类 COMVISIBLE 并
  • 在 Windows Docker 上安装 Matlab

    尝试在 docker 映像上安装 Matlab 运行时以及我正在处理的项目 该项目是一个引擎 它将根据给定的内容运行各种测量 其中许多测量都使用 Matlab 当我运行 docker 时 出现 MWArray 程序集初始化失败 或缺少 ma
  • 检测 Android 中的应用程序崩溃

    我正在构建一个有时会崩溃的应用程序 我想知道它在下次打开它时崩溃 以便我可以向用户建议一些崩溃后选项 我怎样才能检测到崩溃 另外我希望能够在崩溃之前保存用户的工作 我的意思是实时检测崩溃 我可以在不知道崩溃位置的情况下做到这一点吗 您需要知
  • CSSMERR_TP_NOT_TRUSTED 错误

    我按照文档做了所有事情 我将 Apple 全球开发人员证书标记为始终可信 iPhone 发行版为 始终可信 但我遇到了以下错误消息 Users keyss Desktop Deep Free Version build Release ip
  • 衡量 Kotlin 代码的测试覆盖率?

    有没有办法衡量 Kotlin 代码的测试覆盖率 Jacoco 给出错误的结果 因为无法确定自动生成的代码 还有其他解决办法吗 如果您正在使用 IntelliJ IDEA 此链接将对您有所帮助 https www jetbrains com
  • 单页应用程序的 webforms 与 asp.net mvc - 选择哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Vagrant 超时

    有一些问题让我的流浪汉站起来 拿到箱子就跑vagrant init之后vagrant up命令我收到此消息 Bringing machine default up with virtualbox provider gt default Im
  • 设计 + 主动管理重定向

    我在为我的应用程序设置重定向时遇到问题 用户应该转到他们的个人资料 用户 节目 管理员应该转到管理仪表板 我该如何设置 目前出现以下错误 NameError in ActiveAdmin Devise SessionsController
  • 运行yarn install时,如果一个模块不提供另一个模块,这意味着什么?

    当我跑步时yarn在我使用 firebase 的 React 应用程序上 我会收到几个警告 例如 firebase auth npm 0 14 5 c52f6 doesn t provide firebase email protected
  • 带冒号的 Javascript 内部函数

    我知道你可以写以下内容 var obj test something 但在这段代码中 内部函数引用的不是变量 而是函数 还有其他方法可以编写 调用内部函数吗 function outer var a Outerfunction consol
  • 如何制作可点击的 CSS3DObject

    我正在使用三个 JS CSS3DRenderer 尝试使 CSS3DObject 在单击时更新其position z 这是我的代码 var element document createElement div element style w
  • 使用 C# 执行 SSIS 包时出错

    我尝试执行一个非常简单的SSIS封装使用C 直接在 Visual Studio 2015 中启动时 此包运行良好 SSIS 包的名称是 Lesson 1 dtsx 我尝试使用开始这个过程C 使用以下代码 using System using
  • 搜索循环后网络抓取表格

    该表的 HTML 为 table border 1 width 100 tr class row0 td style width 30 strong TITLE strong td td style width 40 UNIQUE td t
  • 使用 RxJS 和 Angular2 限制并发 http 请求

    我以前见过这个问题 但回答总是让我不满意 所以我会尽量准确 我在用着https www npmjs com package rxjs https www npmjs com package rxjs想要对大量的 http 请求进行排队 并且