await 返回 promise 成功解决后的值,若被拒绝则抛出异常;它解包已决议的 promise,对非 promise 值自动包装,不改变 promise 状态,仅消费其最终结果。

await 表达式本身不返回 Promise,而是返回 Promise 成功解决(fulfilled)后的值;若 Promise 被拒绝(rejected),则抛出异常,不会作为正常返回值出现。
await 的本质是“解包”已决议的 Promise
await 并非等待任意异步操作完成,而是等待一个 Promise 实例进入 fulfilled 状态,并提取其内部值。它会自动调用 Promise 的 then 方法,把 resolve 的参数作为自己的结果。
- 如果 await 后跟的是一个已 fulfilled 的 Promise(如
await Promise.resolve(42)),直接得到42 - 如果 await 后跟的是一个尚未决议的 Promise,JavaScript 引擎会暂停当前 async 函数的执行,让出线程,待该 Promise settled 后再继续
- 如果 await 后跟的不是 Promise(比如数字、字符串、普通对象),JavaScript 会隐式调用
Promise.resolve()包装它,再等待——所以await 100等价于await Promise.resolve(100),最终仍得100
错误处理:rejected Promise 不会“返回”,而是 throw
await 对应的 Promise 若被 reject,不会返回 rejection 原因,而是立即抛出错误,中断后续代码执行(除非被 try/catch 捕获)。
-
await Promise.reject(new Error('fail'))会直接抛出该 Error,就像同步代码中 throw 一样 - 常见写法是用
try...catch捕获: try {
const data = await fetch('/api').then(r => r.json());
} catch (err) {
// 这里拿到的就是 reject 的原因(Error 或任意值)
}
无法直接从 await 得到 “成功/失败” 状态标识
await 本身没有内置机制告诉你这次等待是成功还是失败——它只在成功时给你值,在失败时抛异常。如需统一处理成功与失败(比如类似 Promise.allSettled 的行为),需手动包装:
- 可封装成返回
{ status: 'fulfilled' | 'rejected', value?: any, reason?: any }的工具函数 - 例如:async function safeAwait(p) { try { return { status: 'fulfilled', value: await p }; } catch (e) { return { status: 'rejected', reason: e }; } }
- 这样调用
const result = await safeAwait(Promise.reject('oops'))就能得到结构化结果,避免全局 try/catch
注意:await 不改变 Promise 的状态,只消费它
await 是“读取”操作,不是“触发”操作。它不会让一个 pending Promise 变成 fulfilled,也不会让一个 rejected Promise 变成 fulfilled。它只是等待并响应 Promise 的最终状态。
- 同一个 Promise 被多次 await,每次都会得到相同结果(已缓存的值或重复抛出同一错误)
- await 一个已经 rejected 的 Promise,每次都会重新 throw —— 不会“静默失败”或返回 undefined
- await 不能“重试”或“恢复”失败的 Promise,那是业务逻辑层需要处理的事
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











