如何捕获 ES6 Promise 拒绝并完全停止流程?

2023-12-02

假设我有 4 个功能:runA(), runB(), runC() and runD().

使用 ES6 Promise,在一次完全成功的运行中,这些都将依次运行:

runA()
.then(runB)
.then(runC)
.then(runD)

If runA or runB失败(拒绝或抛出),我想打电话error1()然后完全停止链(不调用runC or runD)。这让我觉得我应该添加一个.catch()在最后.then承诺链:

runA()
.then(runB)
.then(runC)     //won't get called if runA or runB throws
.then(runD)     //won't get called if runA or runB throws
.catch(error1)

But if runC失败了,我想打电话error2()并且仍然停止链(不调用runD).

runA()
.then(runB)   
.catch(error1)  //moved up to only handle runA and runB
.then(runC)     //but now this gets called after error1() is run
.then(runD)     
.catch(error2)

现在我有 2catch链中的调用,runC之后会接到电话error1运行,因为 catch 的结果将默认为resolve。是我唯一的选择error1函数创建一个它总是拒绝的承诺?


不,有error1创造一个总是拒绝的承诺,是not你唯一的选择。

您可以利用以下事实:.then有两个参数:

.then(onSuccess, onFailure)

当给出两个参数时,会产生一个被低估的效果:onFailure will not捕获失败onSuccess。这通常是不可取的,但在这里除外,您可以使用这个事实来分支您的决策树:

runA()
.then(runB)
.then(() => runC().then(runD), error1)
.catch(error2)

这就是你想要的。

  • if runA or runB失败,那么error1被调用并且链停止。
  • if runC or runD失败,那么error2被调用并且链停止。

你也可以这样写:

runA()
.then(runB)
.then(() => runC()
  .then(runD)
  .catch(error2),
error1)

var log = msg => div.innerHTML += "<br>" + msg;

// Change which one of these four rejects, to see behavior:
var runA = () => Promise.resolve().then(() => log("a"));
var runB = () => Promise.reject().then(() => log("b"));
var runC = () => Promise.resolve().then(() => log("c"));
var runD = () => Promise.resolve().then(() => log("d"));
var error1 = () => log("error1");
var error2 = () => log("error2");

runA()
.then(runB)
.then(() => runC().then(runD), error1)
.catch(error2)
<div id="div"></div>

尝试修改其中失败的一个这把小提琴.

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

如何捕获 ES6 Promise 拒绝并完全停止流程? 的相关文章

  • 将 OoXml 插入单词抛出错误:未知

    我一直在尝试通过office js将OOXML插入到word文档的正文内容中insertOoXML 方法 我什至尝试过最简单的实现 认为我在尝试替换 XML 本身中的 fieldCodes 时做了一些不正确的事情 所有结果都是这样Error
  • JavaScript onTouch 不工作

    谁能告诉我为什么这个 onTouch 处理程序没有触发 var myDiv document getElementById existingContent var myButton a href log out a myDiv append
  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 如何在同一页面上使用AJAX处理多个表单

    我有一个表单 当我单击 提交 时 它就被提交了 然后该表单隐藏 操作页面的结果显示在 div 中 classname dig 它工作正常 但是当我添加另一个表单时 它停止正常工作并且所有表单同时提交 我如何更改我的代码 done click
  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • 如何测试 javascript 闭包内的函数

    这似乎是不可能的 也可能是 但我正在尝试更多的 TDD 但我总是在闭包方面碰壁 假设我有以下内容 function createSomething init function privateMethod param return init
  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • 从数据 URI 解码 QR 码

    我尝试从数据 uri 中解码二维码 var dataUri data image gif base64 R0lGODdh9gD2AIAAAAAAAP ywAAAAA9gD2AAAC decodeQrCode dataUri cb 我已经尝试
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比

随机推荐

  • 尝试获取 singleValueExtendedProperties 时收到 400 和 500

    尝试向日历对象添加扩展属性 我可以使用以下有效负载创建日历 Ruby 语法 有效负载以 JSON 形式发送 name build calendar name singleValueExtendedProperties id String S
  • 如何使用 viewmodel 单例进行活动?

    MyApp需要在整个上下文中保存一个User对象 A B C活动的xml使用这个User对象 当A编辑User时 我想要B和C通知Change 如何使用数据绑定 livedata和viewModel处理这个问题 以前我让User class
  • Python Selenium 更改文本大小(缩放?设置?...)

    我有一个网页 我需要先截屏 然后使用 OCR 解析出里面的文本 如果放大 Mac command OCR 的性能会显着提高 所以我想知道如何在Python中使用selenium来放大 缩小 有一个类似的post但他们只有Java和C 的实现
  • 在 colorbox 中的图像下方添加 div

    使用 PHP 和 jQuery 目前使用 Colorbox 显示图像幻灯片 我想在每个图像下方包含一个 DIV 当每个图像显示新内容时会更新 可用于展示相关内容 评论功能等 四处研究但尚未找到任何答案 有人以前这样做过或有任何线索吗 我想我
  • 检测应用程序是否从应用程序“外部”启动/恢复

    我目前正在为应用程序构思一项功能 我希望有一种通用方法 方法来检测应用程序本身是否已从 启动或恢复outside 该应用程序 Outside 在这种情况下 意味着 应用程序由启动器图标启动 恢复 通过按导航栏 按键上的 应用程序按钮 来启动
  • 在 Teams 平台上更新 BotFramework v4 中的活动

    我有一个使用 NodeJS 使用 Bot Framework v4 开发的机器人 并部署在 Teams 中的多个渠道上 有没有办法更新机器人发送的消息 我尝试在 BotFrameworkAdapter 中实现 updateActivity
  • cx_Freeze-导入错误:无法导入名称设置

    我使用的是 Windows 7 机器 cx Freeze 4 3 1 和 Python 3 3 Python 和 cx Freeze 都是 32 位版本 我编写了一个 setup py 脚本 如下所示 import sys from cx
  • Javascript如何转义字符

    我想在 div 中插入一些 html 假设 div div 我在用 Sag html data 为了将数据插入到该 div 中 但这是我的数据的问题 table table
  • android 中有安装事件吗?

    是否有一些事件 接收器或用于处理安装后或安装后直接执行的首次执行 或者我需要它根据偏好进行模拟吗 有的是ACTION PACKAGE ADDED广播意图 但正在安装的应用程序不会收到此意图 因此 检查是否设置了首选项可能是最简单的解决方案
  • 按位与 (&) 运算符执行什么数学函数(JS)?

    一点背景知识 当我试图解决 javascript 问题以找到所有可能的子集时 我正在查看另一篇 SO 帖子 我不是在问 JS 挑战 而是问它为什么存在以及它有什么数学意义 这是代码的复制粘贴这个帖子 var arr 1 2 3 functi
  • 如何在基于 MSI 的卸载过程中停止正在运行的进程?

    我在 Windows XP 上使用 Wise Package Studio 7 0 SP2 我有一个 MSI 包装的 EXE 安装 它可以愉快地安装一些文件 然后运行安装中的其中一个文件 我们可以将其称为 app exe 因此 在 MSI
  • 在多索引 DataFrame 中添加和重命名列

    这篇文章的目的是了解如何将列添加到MultiIndex DataFrame using apply and shift 创建数据框 import pandas as pd df pd DataFrame 5777 100 5385 200
  • YouTube API v3 点赞视频,但计数器不增加

    每当我尝试通过 YouTube API 点赞某个视频时 它都会将该视频标记为点赞 但点赞计数器不会在我点赞时增加 它告诉我我喜欢这个视频 因为喜欢按钮是全绿色的 但它并没有算作喜欢 我通过 PHP 的 CURL 使用此链接 https ww
  • python selenium无法使用cookie登录youtube帐户

    警告 此线程中提供的 cookie 可能已经无效 因此您应该使用您自己的或其他一些 cookie 来执行此操作 我需要使用以下方式登录我的 YouTube 帐户饼干和硒 我可以发送请求至https www youtube com 与饼干 它
  • boost::random::uniform_real_distribution 在处理器之间应该是相同的吗?

    以下代码在 x86 32 位和 64 位处理器上产生不同的输出 应该是这样吗 如果我将其替换为 std uniform real distribution 并使用 std c 11 进行编译 它将在两个处理器上产生相同的输出 include
  • 分段错误取决于字符串长度?

    我正在编写一个程序 它将使用 getline 从 infile 读取行并将其转换为字符串 将字符串转换为包含字符串的前 m 个非空白字符的 c 字符串 然后将 c 字符串连接成单个 char 数组 示例文件可能如下所示 5 number o
  • 在 C# 中从 HTML 表中检索数据

    我想从 HTML 文档中检索数据 我正在从一个几乎完成的网站上抓取数据 但在尝试从表中检索数据时遇到问题 这是 HTML 代码 div div
  • CASE 相当于嵌套 IIF 语句

    谁能将以下嵌套 IIF 解码为 SQL 中的 CASE 语句 我知道 SQL Server 2012 中允许使用 IIF 但我发现很难轻松掌握嵌套 IIF 逻辑 以下是我的嵌套 IIF 语句 IIF IIF TABLE A Col 1 0
  • pkg-config:未找到命令,在 Windows 7 上使用 cygwin

    我在 Windows 上使用 Cygwin 来运行此命令 g pkgconfig libs cflags opencv I o mergevec mergevec cpp 但我收到一个错误 bash pkg config command n
  • 如何捕获 ES6 Promise 拒绝并完全停止流程?

    假设我有 4 个功能 runA runB runC and runD 使用 ES6 Promise 在一次完全成功的运行中 这些都将依次运行 runA then runB then runC then runD If runA or run