新闻中心
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 是一款创新的AI故事生成助手,用
AI快速生成连续性、一致性的角色和故事。
319
查看详情
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中用于操作多维数组的非拥有视图


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