await 表达式等待 Promise 的 fulfilled 状态并自动解包其值,async 函数返回值总会被包装为 Promise,且 await 会逐层解包嵌套 Promise,无需手动 .then();若忽略 await 则直接得到 pending Promise。

await 表达式等待的是 Promise 的 fulfilled 状态,它不关心这个 Promise 是谁创建的——无论是直接 new Promise()、普通异步操作(如 fetch),还是另一个 async 函数的返回值。只要被 await 的表达式最终产生一个 Promise,JavaScript 就会暂停当前 async 函数执行,等它 settle 后再继续,并把 fulfilled 的值作为 await 的结果。
async 函数的返回值本身就是 Promise
每个 async 函数都会自动包装返回值为 Promise。即使你 return 一个普通值(比如字符串或对象),它也会被 Promise.resolve() 包裹;如果 return 一个已存在的 Promise,那它就原样被返回。
- return 42 → 等价于 Promise.resolve(42)
- return Promise.resolve("ok") → 直接返回该 Promise
- return anotherAsyncFn() → anotherAsyncFn() 本身返回 Promise,所以 await 后拿到的是它的 fulfilled 值,不是 Promise 实例
嵌套 await:一层一层解包,不需手动 .then()
当你 await 一个 async 函数调用时,你得到的是它内部 return 的值(已自动解包),不是 Promise 对象本身。不需要再用 .then() 或二次 await ——除非你故意想再次等待同一个 Promise(这通常无意义)。
例如:
立即学习“Java免费学习笔记(深入)”;
async function inner() {<br> return "hello";<br>}<br><br>async function outer() {<br> const result = await inner(); // result 是字符串 "hello",不是 Promise<br> console.log(result); // ✅ 输出 "hello"<br>}
注意:不要误把 Promise 当作原始值使用
如果你忘了 await,或者错误地对 async 函数调用本身做操作(比如直接 console.log(inner())),你会看到 Promise { <pending> }。这时它还没被 resolve,你需要 await 或 .then() 才能拿到实际值。
- const p = inner(); → p 是 Promise,不能直接当字符串用
- console.log(p); → 输出 Promise { <pending> }
- console.log(await p); → 输出 "hello"
多个 await 连续写,天然顺序执行
如果 outer 调用了多个 async 函数,每个 await 都会等待前一个 Promise 完成后再发起下一个,形成串行逻辑:
async function getUser() { return { id: 1 }; }<br>async function getProfile(id) { return { name: "Alice" }; }<br><br>async function load() {<br> const user = await getUser(); // 等待 getUser 完成<br> const profile = await getProfile(user.id); // 等待 getProfile 完成<br> return { ...user, ...profile };<br>}
这里 getProfile 的调用依赖 user.id,而 user.id 只有在 getUser() resolve 后才能拿到 —— await 自动保证了这一点。


















