新闻中心

Promise 构造函数中的异常为何不会阻止脚本的继续执行?

2025-11-02
浏览次数:
返回列表

promise 构造函数中的异常为何不会阻止脚本的继续执行?

本文旨在解释 Promise 构造函数中抛出异常时,为何脚本会继续执行,而不是像同步代码那样立即停止。我们将深入探讨 Promise 的内部机制,并通过模拟 Promise 构造函数的简化实现来阐明错误处理流程,帮助读者理解 Promise 如何捕获并处理异常,从而保证程序的健壮性。

在 J*aScript 中,Promise 构造函数用于创建 Promise 对象,它接受一个 executor 函数作为参数。这个 executor 函数会立即同步执行。当 executor 函数内部发生错误时,很多人可能会期望脚本立即停止执行。然而,实际上,脚本会继续执行,这是因为 Promise 内部实现了错误捕获机制。

让我们通过一个例子来理解这个问题:

console.log('first');
const promise1 = new Promise((resolve, reject) => {
  console.log('inside executor');
  let what = 1;
  console.log(what()); // 抛出 TypeError
  console.log('not reached');
  resolve('Hi Guys!');
});
console.log('continues');

这段代码的输出如下:

first
inside executor
continues
Uncaught (in promise) TypeError: what is not a function
    at <anonymous>:4:15

可以看到,尽管 what() 抛出了 TypeError,但 console.log('continues') 仍然被执行了。这是因为 Promise 内部捕获了 executor 函数中的错误,并将 Promise 的状态设置为 rejected。

Promise 的内部错误处理机制

为了更好地理解 Promise 的错误处理机制,我们可以参考 ECMAScript 规范中关于 Promise 构造函数 的描述。简而言之,当 executor 函数执行过程中发生错误时,Promise 会捕获这个错误,并将 Promise 的状态设置为 rejected,但不会阻止脚本的继续执行。

以下是一个简化的 Promise 构造函数实现,可以帮助我们理解其内部机制:

OneStory OneStory

OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。

OneStory 319 查看详情 OneStory
class MyPromise {
    #state
    #resolvedValue
    #customers

    constructor(executor) {
        this.#state = "pending";
        this.#customers = [];
        try {
             executor((value) => this.#resolve(value), 
                      (reason) => this.#reject(reason));
        } catch(err) {
             // 捕获错误,并允许执行继续
             this.#reject(err); 
        }
    }

    #reject(reason) {
        if (this.#state !== "pending") return;
        this.#state = "rejected";
        this.#resolvedValue = reason;
        this.#broadcast(); // 异步调用 then/catch 回调
    }

    #resolve(value) {
        if (this.#state !== "pending") return;
        this.#state = "fulfilled";
        this.#resolvedValue = value;
        this.#broadcast();
    }

    then(onFulfilled, onRejected) {
        return new MyPromise((resolve, reject) => {
            this.#customers.push({
                onFulfilled: onFulfilled ? (value) => {
                    try {
                        const result = onFulfilled(value);
                        resolve(result);
                    } catch (err) {
                        reject(err);
                    }
                } : resolve,
                onRejected: onRejected ? (reason) => {
                    try {
                        const result = onRejected(reason);
                        resolve(result);
                    } catch (err) {
                        reject(err);
                    }
                } : reject,
                resolve,
                reject
            });
            if (this.#state !== "pending") {
                this.#broadcast();
            }
        });
    }

    catch(onRejected) {
        return this.then(null, onRejected);
    }

    #broadcast() {
        if (this.#state === "pending") return;

        this.#customers.forEach(customer => {
            if (this.#state === "fulfilled") {
                customer.onFulfilled(this.#resolvedValue);
            } else {
                customer.onRejected(this.#resolvedValue);
            }
        });
        this.#customers = [];
    }
}

在这个简化的实现中,constructor 函数使用 try...catch 块来捕获 executor 函数中可能抛出的错误。如果发生错误,catch 块会调用 #reject 方法,将 Promise 的状态设置为 rejected,并将错误信息存储起来。

如何处理 Promise 中的错误

虽然 Promise 构造函数中的异常不会阻止脚本的继续执行,但我们仍然需要处理这些错误。通常,我们使用 catch 方法来捕获 Promise 的 rejected 状态:

console.log('first');
const promise1 = new Promise((resolve, reject) => {
  console.log('inside executor');
  let what = 1;
  console.log(what());
  console.log('not reached');
  resolve('Hi Guys!');
}).catch(error => {
  console.error('Error caught:', error);
});
console.log('continues');

在这个例子中,catch 方法会捕获 TypeError,并将其打印到控制台。

总结

Promise 构造函数中的异常不会阻止脚本的继续执行,这是因为 Promise 内部实现了错误捕获机制。为了处理 Promise 中的错误,我们可以使用 catch 方法。理解 Promise 的错误处理机制对于编写健壮的 J*aScript 代码至关重要。通过捕获并处理 Promise 中的错误,我们可以避免程序崩溃,并提供更好的用户体验。

以上就是Promise 构造函数中的异常为何不会阻止脚本的继续执行?的详细内容,更多请关注其它相关文章!


# 可选  # 南京seo优化机构  # 自贡网站建设专业营销团队  # 沭阳网站建设推广电话  # seo优化系统白帽  # 京东网站建设思维导图  # 台州建设专家网站首页  # 网站建设 网站运营  # 盐城搜索引擎seo优化  # 南通seo优化方法  # 假睫毛营销推广方案  # javascript  # 数据结构  # 我们可以  # 在这个  # 发生错误  # 这是因为  # 设置为  # 并将  # 抛出  # 有哪些  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  铁路12306的积分有效期是多久_铁路12306积分有效期说明  j*a toString()的覆盖  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  Golang指针如何与map组合使用_Golang map指针组合实践  拼多多赚钱渠道_拼多多收益来源  抖音极速版最新版本 抖音极速版官方下载地址  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  Kafka Streams中基于消息头条件过滤消息的实现指南  优化大型XML文件解析:基于Python流式处理的内存高效方案  2026春节假期时间安排 2026春节假日查询  c++ dfs和bfs代码 c++深度广度优先搜索算法  Shopware订单对象中获取产品自定义字段的正确方法  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  C#中解析不规范的HTML为XML 常见的坑与解决办法  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  新手怎么开始学化妆 零基础化妆入门教程  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  小米14应用无法联网原因分析_小米14网络权限修复  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  Lar*el 8 多关键词数据库搜索优化实践  React中useState与局部变量:理解组件状态管理与渲染机制  163邮箱注册官网 免费申请163个人邮箱  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  大麦的“候补”是什么意思 大麦候补购票规则【详解】  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  漫蛙漫画官方首页 漫蛙2漫画在线阅读入口  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  12306怎么选座位选到安静区_12306选座安静区域选择策略  小米汽车11月交付量突破40000台!雷军:将继续努力  Tabulator表格中精确实现日期时间排序的指南  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  126邮箱网页版官方入口 126邮箱账号在线登录平台  实现分段式页面滚动导航:CSS与J*aScript教程  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图 

搜索