async函数返回的promise在内部抛出错误时自动进入rejected状态;包括同步throw、await reject的promise、运行时异常等,try/catch可捕获但不阻止reject,未捕获则冒泡为rejection。

async 函数内部只要抛出错误(无论是 throw、运行时异常,还是 Promise 被 reject),该 async 函数返回的 Promise 就会自动进入 rejected 状态——这是语言本身的机制,无需手动转换。
哪些情况会自动触发 reject
以下所有情形都会让 async 函数返回的 Promise 自动变为 rejected:
-
throw new Error('xxx')(同步 throw) await Promise.reject(new Error('xxx'))-
await someAsyncFn(),而someAsyncFn返回的 Promise 是 rejected 的 - 访问未定义变量、调用非函数值等导致的同步运行时错误(如
undefined.foo())
注意:try/catch 不会阻止 reject,只是让你能捕获处理
加 try/catch 是为了在 async 函数内部消化错误,避免它向外传播。如果不 catch,错误自然冒泡为返回 Promise 的 rejection:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
async function bad() {
throw 'oops'; // ✅ 自动让返回的 Promise 变成 rejected
}
bad().catch(err => console.log(err)); // 输出: 'oops'
async function good() {
try {
throw 'oops';
} catch (e) {
return `handled: ${e}`; // ✅ 不再 reject,而是 resolve 这个字符串
}
}
good().then(console.log); // 输出: 'handled: oops'
常见误区:return 一个被 reject 的 Promise 不等于 throw
直接 return Promise.reject(...) 和 throw 效果一致,都导致最终 Promise rejected;但要注意写法差异:
-
throw err→ 等价于return Promise.reject(err) -
return Promise.reject(err)→ 显式返回 rejected Promise,效果相同 -
return new Promise((_, reject) => reject(err))→ 同样有效,但没必要绕路
调试建议:统一用 .catch 或 try/catch 捕获
为避免 unhandled rejection 报错,推荐始终处理 async 函数的失败路径:
- 调用处用
.catch()或await ... .catch() - 函数内部用
try/catch控制错误流向(resolve 特定值 or re-throw) - 开发时开启浏览器或 Node.js 的
unhandledrejection监听,快速定位漏处理的错误










