await后跟普通值直接返回,不暂停不报错;跟拒绝的promise则立即抛错,必须try-catch捕获,否则中断执行并冒泡错误。

await 后面跟普通值或拒绝的 Promise,行为完全不同,但处理方式其实很直接。
await 后面是普通值(比如数字、字符串、对象)
它会立即把该值包装成一个已兑现(fulfilled)的 Promise,然后同步返回这个值。也就是说,await 123 等价于 await Promise.resolve(123),不会暂停执行,也不会报错。
- 不需要 try-catch,因为永远不会被拒绝
- 可以放心赋值:
const x = await 42;→x就是42 - 常见于条件分支中统一 await:比如
await (condition ? apiCall() : 'default')
await 后面是被拒绝(rejected)的 Promise
会立刻抛出错误,就像执行了 throw reason,必须用 try...catch 捕获,否则会导致当前 async 函数中断,并把错误向上冒泡到调用链。
- 不捕获就会变成未处理的 Promise rejection,控制台报错,还可能触发全局
unhandledrejection事件 - 正确写法:
try { const data = await fetch('/api').then(r => r.json()); } catch (err) { console.error(err); } - 注意:不能只靠
.catch()链式调用,因为await不会“吞掉”错误;await promise.catch(...)是错的,它会让await等到一个已处理的 Promise,结果永远成功
想让 await “静默失败”,统一返回默认值
可以封装一个辅助函数,把拒绝转为成功并返回 fallback 值,避免到处写 try-catch。
- 简单封装:
async function safeAwait(promise, fallback = null) { try { return await promise; } catch { return fallback; } } - 使用:
const data = await safeAwait(fetch('/api').then(r => r.json()), {}); - 也可以用 Promise.prototype.catch 配合 Promise.resolve,但要注意返回的是 Promise,不是原始值
常见误区提醒
很多人以为 await undefined 或 await null 会出错,其实不会——它们和普通值一样,被自动 resolve;真正危险的是没处理 reject 的 Promise。
-
await Promise.reject('oops')→ 抛错,必须 catch -
await null→ 返回null,完全合法 -
await (async () => { throw 'err' })()→ 同样抛错,因为返回的是 rejected Promise
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











