
当使用 await 等待一个被拒绝的 promise 时,若未用 try-catch 捕获错误,javascript 不会静默忽略异常,而是抛出未捕获的 rejection,导致后续代码不执行——但原示例中 console.log 仍被打印,根本原因在于 f2() 实际并未返回被拒绝的 promise。
当使用 await 等待一个被拒绝的 promise 时,若未用 try-catch 捕获错误,javascript 不会静默忽略异常,而是抛出未捕获的 rejection,导致后续代码不执行——但原示例中 console.log 仍被打印,根本原因在于 f2() 实际并未返回被拒绝的 promise。
问题核心不在 await 的行为本身,而在于函数 f2() 的实现存在关键疏漏:它调用了 Promise.reject("promise rejected"),但没有 return。因此 f2() 实际返回的是一个 fulfilled 的 Promise(值为 undefined),而非被拒绝的 Promise。
我们来验证这一点:
async function f2() {
Promise.reject("promise rejected"); // ❌ 仅创建并丢弃拒绝的 Promise,无返回
}
console.log(f2()); // Promise {<fulfilled>: undefined}由于 f2() 返回的是 fulfilled 状态的 Promise,await f2() 会正常解析为 undefined,后续 console.log(...) 自然得以执行——这正是你观察到“本不该打印却打印了”的根本原因。
✅ 正确写法必须显式 return 被拒绝的 Promise:
async function f2() {
return Promise.reject("promise rejected"); // ✅ 显式返回 rejected Promise
}此时 await f2() 将立即抛出该错误,中断后续执行。但仅靠 await 并不能自动捕获错误——异步错误需由 try...catch 主动兜底:
async function f1() {
try {
const p = await f2(); // 抛出 "promise rejected"
console.log("This line should not get printed since the promise was rejected");
} catch (error) {
console.error("Caught rejection:", error); // ✅ 安全捕获
}
}
async function f2() {
return Promise.reject("promise rejected");
}
f1();
// 输出:Caught rejection: promise rejected
// → console.log 不会执行⚠️ 注意事项:
- await 不是“错误处理器”,它是“等待器”;拒绝的 Promise 会以异常形式向上冒泡,必须用 try-catch 捕获;
- 忘记 return 是常见陷阱,尤其在箭头函数或简化写法中(如 const f2 = () => Promise.reject(...) 是安全的,但 const f2 = () => { Promise.reject(...) } 则无效);
- 在顶层 await(ES2022+ 模块中)或 Node.js 脚本中,未捕获的 Promise rejection 会触发 unhandledrejection 事件,应监听并告警;
- 生产环境建议统一配置全局 rejection 处理器作为兜底:
window.addEventListener('unhandledrejection', event => {
console.error('Unhandled Promise rejection:', event.reason);
event.preventDefault(); // 阻止控制台警告(按需)
});总结:修复此类问题需两步——一确保被拒绝的 Promise 被正确返回,二用 try-catch 主动捕获 await 抛出的异常。二者缺一不可。

















