取消 flatMap 可观察调用链

2024-06-28

我正在使用 Angular 5 和 rxjs。我正在拨打 2 次服务电话,其中一次取决于其他结果。我正在使用 flatMap 进行此操作。我还使用 takeUntil,以便我可以在任何给定点中止操作。我的代码如下所示:

this.myservice.api1(param1).pipe(takeUntil(this.destroyed$), finalize(() => {
//do something after both api calls are completed
},
flatMap((result1) => {
    //do some operation and create object x(this.objx)
    return this.myservice.api2(param1);
})
).subscribe((result2) => {
    //do something based on result2 and this.objx
})

这段代码在 for 循环中执行,循环执行了 200 次。因此进行了 400 次网络调用。我在 UI 上有一个按钮可以中止此操作,并且这个.destroyed$observable 在被点击时被执行。对于未进行第二次 API 调用的任何迭代(api2),我可以通过这种方式中止。如果仅调用第一个 API,则该请求将被取消。如果 api2 已被调用,需要 20-30 秒才能响应,则不会被取消。我希望两个 API 调用都被取消。是否可以?


你可以重组你的链条并把takeUntil在最后。

this.myservice.api1(param1).pipe(
  mergeMap((result1) => { // flatMap is just alias for `mergeMap` which is the recommended name you should use
    //do some operation and create object x(this.objx)
    return this.myservice.api2(param1);
  }),
  takeUntil(this.destroyed$),
  finalize(() => {
    //do something after both api calls are completed
  },
).subscribe((result2) => {
  //do something based on result2 and this.objx
});

你遇到的问题是如何mergeMap在内部工作(这是故意的)。mergeMap合并其源 Observable 和所有内部 Observable。所以如果你把takeUntil before mergeMap您刚刚完成源 Observable,而所有内部 Observable 仍处于活动状态。

如果你把它放在后面mergeMap它将让观察者完成哪些触发处理处理程序自下而上的顺序以及何时mergeMap取消订阅它会取消订阅其内部的 Observables。

这是相关行:https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/mergeMap.ts#L147 https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/mergeMap.ts#L147

另请参阅 RxJS 核心开发人员之一的这篇文章:https://ncjamieson.com/avoiding-takeuntil-leaks/ https://ncjamieson.com/avoiding-takeuntil-leaks/

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

取消 flatMap 可观察调用链 的相关文章

  • 我可以使用指定的种子运行 Karma 测试吗? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在从事一个用 Karma Jasmine 进行测试的 Angular 项目 默认情况下 角度测试按随机顺序运行 如果按特定顺序运行 可能
  • 在 Angular 2 中的 for...of 指令中获取索引

    到目前为止 有没有办法获取可迭代对象的当前索引for ofAngular 2 中的指令 换句话说 相当于 index在 Angular js v1 中 代码示例 ul li index task label li ul 当然这段代码不起作用
  • angular2-jwt 检查组件中的令牌是否过期?

    是否可以检查 Angular 2 应用程序组件内的 id 令牌是否过期 我用该方法得到了 AuthService public isAuthenticated boolean check if id token is expired or
  • 从 http.get() 加载的 JSON 数据在我的 Angular 2 模板中未定义

    我正在尝试读取本地 json 文件并将其解析为我制作的具有相同属性的类 当我尝试从类中读取时 它给出错误 指出该类为 null 或未定义 我有一个文件hall ts看起来像这样 import Item from item item expo
  • AADSTS65001:用户或管理员尚未同意使用 ID 为 的应用程序

    我正在开发一个使用 Microsoft 的 OAuth2 代表用户流程 的 Angular Flask 应用程序 我试图从后端调用 API 但出现异常 这是配置app module ts export function MSALInstan
  • 由于外部库而构建时出现角度错误 - 意外值“BannerModule...”

    我使用 ng packagr 模块创建了一个库 以便在两个不同的项目之间共享一些组件 The structure of the lib is 在我的图书馆里 src package json name my ng library versi
  • Firebase 托管上的 Angular 9 项目无法传递 https 请求

    我在我的角度项目上使用了代理 如下所示 api target https
  • Angular 5 材质小吃栏

    我遇到的问题是 小吃栏组件在初始化时附加在 cdk global overlay wrapper 外部 位于 cdk overlay container 内 这使得它在屏幕中间瞬间可见 然后它消失并重新附加到 cdk global over
  • Angular 2 Spring 安全 CSRF 令牌

    大家好 我在为我的应用程序设置安全解决方案时遇到问题 所以我有一个 REST API 后端 运行在http 本地主机 51030 http localhost 51030并使用 Spring Framework 进行开发 对于前端 我有一个
  • Angular:绑定到 @Input 别名

    我正在尝试在以下指令中设置输入别名example https angular io guide attribute directives bind to an input alias Input appAvatarColor name st
  • Angular 2 CanActivate 被调用两次

    我在使用 Angular 时遇到了路线守卫的问题 当导航到由于我未登录而不允许的页面时 我的 CanActivate 防护被调用两次 我有 1 个根模块 并在那里提供了我的 CanActivate 防护和其他服务 先感谢您 这是我的路由器
  • Ionic 3 同时进行深度链接和延迟加载

    根据我在文档 https ionicframework com docs api IonicModule forRoot and forums https forum ionicframework com t how to configur
  • 如何在 Angular 中存储来自谷歌位置自动完成的纬度和经度

    自从一年前我遵循本教程以来 我决定将问题和答案发布在 stackoverflow 中 https www youtube com watch v pxyX 5mtlTk https www youtube com watch v pxyX
  • 如何使用 angular2 在客户端生成 rsa 密钥对?

    我需要知道如何使用 angular2 在客户端生成 rsa 密钥对 我需要生成私钥 公钥对并将私钥保存到数据库中 并希望在客户端内使用公钥 我怎样才能实现这个 我找到了这个https www npmjs com package genera
  • 系统js语法错误,IE11

    我有一个 Angular 2 应用程序可以在 Firefox 和 Chrome 中工作 但在 IE 中却没有那么多工作 根据我的堆栈跟踪 我的 System js 设置似乎存在问题 这是我在网络控制台中看到的错误描述 Error Syste
  • Angular2从模块导入组件/服务

    我正在开发一个 Angular2 最终应用程序 它 当前 有两个模块 CoreModule 包含共享组件 服务 AppModule 应用程序的根模块 应用程序模块 Created by jamdahl on 9 21 16 Angular
  • 未处理的 Promise 拒绝:push.on 不是函数

    我正在使用离子2 我得到这个打字稿error当尝试设置推送通知时 我从教程中复制了此示例代码 因此预计它可以工作 我一定有什么问题 任何想法请 Unhandled Promise rejection push on is not a fun
  • 检查标记坐标是否在边界内

    我在用着leafletAngular 6 应用程序中的地图 我获取每个项目的位置信息为 lat xx lng xx 我还得到了边界对象 它描述了地图当前可见的区域 它随着拖动和缩放而变化 边界对象如下所示 northEast lat 76
  • 在 *ngFor 中创建局部变量

    是否可以在 ngFor 中创建局部变量 例如 div 您可以将 ng container 与 ngIf 结合使用来实现此目的 div class message list div div
  • 在 Angular 6 和 ASP.net 中启用 CORS

    我正在尝试从 Angular 6 应用程序向发送电子邮件的 API 发送 POST 请求 我用邮递员测试了该请求并且它有效 但是当我在 Angular 应用程序中执行 POST 请求时 我的控制台中出现错误 我在 Angular 应用程序中

随机推荐

  • 围绕 glutMainLoop 执行程序的其余部分?

    我目前正在开发一个项目 其中有一个 android 应用程序 我在 PC 上的 OpenGL 窗口中编写了控件和对象 我已经让 OpenGL 窗口执行我想要的操作 并且我从 Android 设备获取了数据以流式传输到终端 但是我需要将数据传
  • 如何知道我正在使用 ndk-build 构建哪个 API 级别?

    我试图更好地理解使用 ndk build 时 api 级别的选择是如何工作的 我知道我可以明确设置APP PLATFORM in 应用程序 mk 否则 ndk build 将针对清单中指示的 apiandroid minSdkVersion
  • 尝试计算盒子的分数时小数精度损失

    我有一个场景 我有一个包含 3 个罐头的标准盒子 出于显示和查询的目的 我必须以其标准配置的十进制数量进行报告 不可能说1盒3罐 1盒2罐 等等 例如 最初我会有1盒3罐然后我移除 1 个罐子 结果是0 66 循环盒 3 罐然后我再移除 1
  • 在会话中检索并保存 gridview

    当我在文本框中写入我的名字时 我有一个用于搜索的页面 例如 它将搜索并在 GridView 中显示结果 我正在使用一个EntityDataSource with a QueryExtender所以我没有用C 编写任何代码 问题是 在 Gri
  • 使用 toYaml 进行 helm 模板化

    我有values yml 文件 它接受具有以下格式和默认值的端口列表 Ports number 443 protocol http 输出用作输入的端口列表的脚本给出了以下格式 port list get ports sh output 80
  • 在我自己的自定义 appSettings 上使用 foreach 所需的代码

    我搜索了该网站 但没有找到我想要的内容 接近 但没有雪茄 基本上我想要一个像这样的配置部分
  • 有没有文档描述 Clang 如何处理过多的浮点精度?

    当唯一允许使用的浮点指令是 387 指令时 几乎不可能 以合理的成本提供严格的 IEEE 754 语义 当人们希望让 FPU 工作在完整的 64 位有效数上时 这尤其困难 以便long double类型可用于扩展精度 通常的 解决方案 是以
  • 我可以通过 ssh 将 ssh 用户名与 git 的提交关联起来吗?

    我正在尝试通过 ssh 设置共享 git 存储库 将用户公钥复制到authorized keys 我真的希望 ssh key 中的 用户名 成为存储库中提交历史记录的一部分 这样用户 joe 就不能将他的名字设置为 kate 我们需要某种责
  • 如何清除Android应用程序中的所有活动

    我的应用程序有许多可以按任何顺序调用的活动 活动历史示例 A gt B gt C gt D gt A gt B gt E 现在在活动 E 中 我正在 注销 设备 注销用户 并删除他们可能已下载到 SD 卡的任何数据 期望的行为是应用程序 重
  • 使用 C 与 OpenMP 求和

    我已经尝试并行化这段代码大约两天了 但一直出现逻辑错误 该程序是使用非常小的 dx 之和来求积分的面积 并计算积分的每个离散值 我正在尝试使用 openmp 来实现这一点 但实际上我没有使用 openmp 的经验 我需要你的帮助 实际目标是
  • javascript - 全局变量不起作用

    我想保存一个变量 以便多个函数可以使用它 我按照 w3schools 的指示进行操作 但不起作用 我是不是忘记了什么 先感谢您 var name document getElementById name value function com
  • 将 bash 脚本转换为 python(小脚本)

    我有一个在 Linux 环境中使用的 bash 脚本 但现在我必须在 Windows 平台上使用它 并且希望将 bash 脚本转换为可以运行的 python 脚本 bash 脚本相当简单 我认为 我尝试通过 google 转换它 但无法成功
  • Python 中的 ZeroMQ 和多个订阅过滤器

    我想使用一个套接字使用 Python 中的 ZeroMQ 订阅多个过滤器 sock setsockopt zmq SUBSCRIBE first filter sock setsockopt zmq SUBSCRIBE second fil
  • 使用 Choco 建模网球比赛 (CSP)

    我正在尝试用 Choco 建模一个问题 以获得网球赛事 或任何运动 中可能的比赛组合 我尝试这样做的方式如下 Set of timeslots when the event is held i e 10am 10pm int nTimesl
  • 将 XML 文件导入 SQL Server(不使用 BULK)

    我正在尝试将数据从 XML 文件导入到数据库中 我使用了一个测试脚本BULK INSERT 但是当我在实时数据库上进行测试时 权限BULK被禁用 尝试 1 BULK INSERT XMLTable FROM C Radu test xml
  • 使用 dplyr::mutate 重新编码而不在函数中工作

    我正在尝试使用dplyr mutate across 重新编码 a 中的指定列tbl 单独使用它们效果很好 但我无法让它们在函数中工作 library dplyr library tidyr df1 lt tibble Q7 1 1 5 Q
  • elasticsearch,是否可以更新嵌套对象而不更新整个文档?

    我正在使用嵌套对象索引一组文档 将它们想象为论坛帖子 该嵌套对象是与该帖子相关的用户 我的问题是用户字段可能会更新 但由于帖子没有更改 因此它们不会重新索引 并且用户嵌套对象变得过时 有没有办法更新嵌套对象而无需再次重新索引整个文档 或者唯
  • 在android中将SQLite数据库导出到csv文件

    我正在尝试将 SQLite 数据作为目录中的 CSV 文件导出到 Android 中的 SD 卡 所以我尝试了下面的方法 显然它只显示打印出来的文本 数据库的第一个表日期 项目 金额 货币 在我的 DBHelper java 中 我定义了该
  • VTD-XML 似乎破坏了 XML 文档中的转义字符串

    我正在研究 XML 数据集 DrugBank 数据库可用 here http www drugbank ca downloads 其中某些字段包含转义的 XML 字符 例如 等 为了使问题更加具体 下面是一个示例场景
  • 取消 flatMap 可观察调用链

    我正在使用 Angular 5 和 rxjs 我正在拨打 2 次服务电话 其中一次取决于其他结果 我正在使用 flatMap 进行此操作 我还使用 takeUntil 以便我可以在任何给定点中止操作 我的代码如下所示 this myserv