在 JavaScript 的 Promises 中捕获 Promises 中生成的错误

2024-03-07

Promise 中是否可能出现错误?

请参阅下面的代码以供参考,我想得到promise1.catch捕获中生成的错误promise2(当前不适用于此代码):

function test() {
    var promise1 = new Promise(function(resolve1) {
        var promise2 = new Promise(function(resolve2) {
            throw new Error('Error in promise2!');
        });

        promise2.catch(function(error2) {
            console.log('Caught at error2', error2);
        });
    });

    promise1.catch(function(error1) {
        console.log('Caught at error1', error1);
    });
}

test();

Yes!!

Promise 中的错误传播是它的最强项之一。它的行为与同步代码完全相同。

try { 
    throw new Error("Hello");
} catch (e){
    console.log('Caught here, when you catch an error it is handled');
}

非常类似于:

Promise.try(function(){
    throw new Error("Hello");
}).catch(function(e){
    console.log('Caught here, when you catch an error it is handled');
});

就像在顺序代码中一样,如果您想对错误执行一些逻辑但不将其标记为已处理 - 您可以重新抛出它:

try { 
   throw new Error("Hello");
} catch (e){
    console.log('Caught here, when you catch an error it is handled');
    throw e; // mark the code as in exceptional state
}

变成:

var p = Promise.try(function(){
   throw new Error("Hello");
}).catch(function(e){
    console.log('Caught here, when you catch an error it is handled');
    throw e; // mark the promise as still rejected, after handling it.
});

p.catch(function(e){
     // handle the exception
});

请注意,在 Bluebird 中,您可以进行类型捕获和条件捕获,因此,如果您所做的只是if根据承诺的类型或内容来决定是否处理它 - 您可以保存它。

var p = Promise.try(function(){
   throw new IOError("Hello");
}).catch(IOError, function(e){
    console.log('Only handle IOError, do not handle syntax errors');
});

您还可以使用.error处理OperationalError源自承诺的 API。一般来说OperationalError表示可以恢复的错误(相对于程序员错误)。例如:

var p = Promise.try(function(){
   throw new Promise.OperationalError("Lol");
}).error(function(e){
    console.log('Only handle operational errors');
});

这样做的好处是不静音TypeError代码中的错误或语法错误,这在 JavaScript 中可能很烦人。

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

在 JavaScript 的 Promises 中捕获 Promises 中生成的错误 的相关文章

随机推荐

  • 替换 Swift 2.2 中的 _stdlib_getDemangledTypeName()

    最新版本的 Swift 2 2 删除了 stdlib getDemangledTypeName 我有什么选择来替代它 我目前正在这样的调试消息中使用 let debugStr stdlib getDemangledTypeName self
  • 在 Magento 中操作多个购物车规则

    上次我遇到困难时 我曾询问过如何操纵购物车规则本文 https stackoverflow com questions 18401781 manipulating shopping cart rules 现在 我在购物车规则中添加了更多条件
  • 如何在 postgres 中对结果执行按位运算符?

    如果我有几行 并且我想对结果执行按位或 我该如何在 Postgres 9 x 中执行此操作 例如 我的表包含 Name col1 col2 John 1 2 Walter 1 1 Ron 1 2 我知道想要执行 select 语句 以便从列
  • 如何向非超链接 HTML 标记添加工具提示

    是否有办法向非超链接添加工具提示 IE 我希望当鼠标滑过文本时将鼠标悬停在工具提示上 我希望有一个不基于超链接的工具提示的工作示例 Thanks 如果您所说的工具提示是指title属性 您可以将其应用于许多不同的 HTML 元素 例如spa
  • 任何 Apache HttpClient 4.4 信任自签名证书的示例

    我变了HttpClient版本从旧版本到新版本4 4 并得到了许多已弃用的方法和类 原始代码可以信任自签名证书 我想替换为新方法和类 任何人都可以给我一个如何替换的指南或任何示例代码吗 谢谢 感谢您的回复 我找到了示例代码如下 SSLCon
  • Shinydashboard 标签框高度

    我正在尝试创建一个tabBox横跨整个mainPanel 我能够获得跨越整个屏幕的宽度 但无法获得同样的高度 我不希望使用像素 或其他单位 的绝对值 因为我希望该应用程序能够在不同的屏幕上使用 我玩了这个例子和example http rs
  • 用于图形的 Java 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 用于操作图形 特别是用于社交网络分析 的最佳 Java 库是什么 我见过荣格 但我想知道你是否知道更好的
  • Shadowbox - 打开内联元素

    我正在使用 Shadowbox 和 jQuery 我可以在页面加载时打开它 我想做的是 打开影子框并显示一个表单 用户可以在其中输入他们的电子邮件地址 然后我想通过ajax提交所述表单 我将表单转储到包含在隐藏 div 中的页面上 其 id
  • Apache RewriteRule 将整个 URL 作为参数传递

    目前我的阿帕奇RewriteRule仅将原始 URL 的路径作为查询参数传递给重写的 URL 如何将整个 URL 包括方案和权限等 作为参数发送到重写的 URL I know REQUEST URI 只传递路径 我看不到任何传递整个 URL
  • Asp.Net MVC 4 使用 oAuth2 进行谷歌

    我们正在尝试为现有的 asp net MVC 4 项目启用 使用 google 登录 但现在google已经宣布弃用OpenID 2 0并建议使用OAuth2 我们发现了这个link http www asp net mvc tutoria
  • Aurelia 使可绑定的行为在对象属性上可观察

    在 Aurelia 绑定中 如果在组件中我们对属性使用可观察装饰 并且如果该属性是一个对象 那么我们将订阅该对象的所有属性 例如 import observable from aurelia framework export class C
  • 在 Rust 中,“as”是一个运算符吗?

    Rust 参考目前说了以下内容the as操作员 https doc rust lang org reference html type cast expressions 7 2 12 5 类型转换表达式 类型转换表达式用二元运算符表示as
  • 将开源 CMS 框架集成到现有的 MVC3 / MVC4 站点中 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的任务是寻找一个可以慢慢集成到一组现有网站中的开源 CMS 通过这种方式 页面可以一页一页地传送到
  • 替换 uiimage 中的特定颜色

    假设我只想更改给定 UIImageView 中的特定颜色 每个像素 如何使用以下代码将所有白色像素更改为 darkGray UIImage changeColorForImage UIImage image toColor UIColor
  • 将 pandas df 写入 csv 时出现 Unicode 编码错误

    我清理了 400 个 Excel 文件 并使用 pandas 将它们读入 python 并将所有原始数据附加到一个大 df 中 然后当我尝试将其导出到 csv 时 df to csv path header True index False
  • 在 Python 2.7 中将 print 语句分配给函数中的变量

    我正在尝试将 print 语句分配给函数中的变量 def namer fn ln Smith return value default value r print Your name is fn ln return r 但是当我运行该模块时
  • 对于 common_type,T declval() 而不是 T && declval()

    使用不是更好吗std declval声明形式 template lt class T gt T declval 1 然后是当前的 template lt class T gt T declval 2 for std common type
  • Wordpress 存储用户身份验证数据的方式背后有哪些细节?

    首先 让我定义最终目标 我想要 Wordpress 版本 2 8 来管理网站的身份验证数据 凭据和访问控制 该网站的大部分内容将使用 WordPress 但某些页面将在 Wordpress 环境之外构建 这些页面应该能够使用Wordpres
  • 模板中的 const_cast。有 unconst 修饰符吗?

    我有一个这样的模板类 template
  • 在 JavaScript 的 Promises 中捕获 Promises 中生成的错误

    Promise 中是否可能出现错误 请参阅下面的代码以供参考 我想得到promise1 catch捕获中生成的错误promise2 当前不适用于此代码 function test var promise1 new Promise funct