promise中reject和throw的使用

javascript 复制代码
async function promiseThrow() {
  return new Promise((resolve, reject) => {
    throw new Error("promise error"); 
  });
}
//这样会正常处理
async function promiseThrow() {
  return new Promise(async (resolve, reject) => {
    throw new Error("promise error"); 
  });
}
//这样会出错,外部无法捕获

1. 不使用 async 关键字的 Promise 构造函数回调函数

ts 复制代码
async function promiseThrow() {
 return new Promise((resolve, reject) => { throw new Error("promise error"); }); 
}
promiseThrow().catch((error) => { console.error("Caught error:", error.message); });

在这个例子中,Promise 构造函数的回调函数内部直接 throw new Error("promise error")。虽然这是一个同步错误,但由于它发生在 Promise 构造函数的执行环境中,JavaScript 引擎会将这个错误封装成一个 rejected Promise,并将其关联到返回的 Promise 实例上。因此,外部通过 .catch 方法可以正常捕获这个错误。 2. 使用 async 关键字的 Promise 构造函数回调函数

ts 复制代码
async function promiseThrow() {
 return new Promise(async (resolve, reject) => { throw new Error("promise error"); }); 
} 
promiseThrow().catch((error) => { console.error("Caught error:", error.message); });

在这个例子中,Promise 构造函数的回调函数是一个 async 函数。当 throw new Error("promise error") 执行时,它会生成一个 rejected Promise,但这个 rejected Promise 并未被 Promise 构造函数捕获和处理。由于 async 函数内部的错误被转换为 rejected Promise,这个 rejected Promise 只会在 async 函数返回的 Promise 中体现出来,而 Promise 构造函数本身并未等待这个内部 async 函数的结果。因此,外部的 .catch 无法捕获到这个错误,导致程序意外终止。

结论:

  • 当在不使用 async 关键字的 Promise 构造函数回调函数中 throw 错误时,错误会被 Promise 机制捕获并转换为 rejected Promise,外部的 .catch 可以正常捕获这个错误。
  • 当在使用 async 关键字的 Promise 构造函数回调函数中 throw 错误时,由于 async 函数返回的 Promise 被忽略了,错误实际上未被 Promise 构造函数捕获,导致外部的 .catch 无法捕获,程序意外终止。

对于这种情况,正确的做法是避免在 Promise 构造函数回调函数中使用 async 关键字,或者在 async 回调函数内部使用 reject 来传递错误,如下所示:

ts 复制代码
async function promiseThrow() {
 return new Promise((resolve, reject) => { reject(new Error("promise error")); }); 
} 
// 或者 
async function promiseThrow() {
 return new Promise((resolve, reject) => { const innerPromise = async () => { throw new Error("promise error"); 
};
innerPromise().then(resolve, reject); }); } 
// 外部捕获错误 
promiseThrow().catch((error) => { console.error("Caught error:", error.message); });
相关推荐
Rain5095 分钟前
mini-cc 终端 UI:用 React 写 CLI 是什么体验
前端·人工智能·react.js·ui·架构·前端框架·ai编程
wu85877345711 分钟前
向量数据库不是银弹:从枚举漏检到 ReACT 多轮召回的实践路径
前端·数据库·react.js
古怪今人15 分钟前
[前端]HTML盒模型与尺寸,标准文档流,块级元素、内联元素和行内块,CSS选择器
前端·css
小雨下雨的雨36 分钟前
基于鸿蒙PC Electron框架技术完成的表单验证技术详解
前端·javascript·华为·electron·前端框架·鸿蒙
提子拌饭13337 分钟前
饮料含糖量查询应用 - 鸿蒙PC用Electron框架完整实现
前端·javascript·华为·electron·前端框架·鸿蒙
JustHappy38 分钟前
古法编程秘籍(五):什么是进程和线程?从软件到 CPU 的一次完整旅程
前端·后端·代码规范
爱编程的小金1 小时前
前端请求库的下一个进化方向:从 Promise 到策略化
前端·alova·前端请求库·请求策略
hsg771 小时前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
珑墨1 小时前
前端 AI 开发通用skill
前端
kyriewen1 小时前
一个人+Cursor,7天上线付费小程序:第1天我就想放弃了
前端·微信小程序·cursor