await 暂停当前 async 函数执行但不阻塞主线程,仅限 async 函数或顶层模块使用,自动将任意值转为 Promise,错误需用 try/catch 捕获。

await 会暂停 async 函数内部的执行,直到它右边的 Promise 被 fulfilled(成功)或 rejected(失败),然后继续运行,并返回 Promise 的结果值(或抛出错误)。
await 暂停的是当前 async 函数,不是整个程序
JavaScript 是单线程的,但 await 不会“卡住”浏览器或 Node.js 主线程。它只是让当前 async 函数暂停,把控制权交还给事件循环,允许其他任务(如点击事件、定时器、其他 Promise 回调)继续执行。
例如:
async function example() {
console.log('1');
await Promise.resolve(); // 暂停,但不阻塞主线程
console.log('2'); // 这行要等上面 Promise 完成后才执行
}
console.log('start');
example();
console.log('end');
输出顺序是:start → 1 → end → 2。说明 await 后的代码被推迟到了当前宏任务之后(放入微任务队列末尾)。
立即学习“Java免费学习笔记(深入)”;
await 只能用在 async 函数内部
直接在普通函数或全局作用域中写 await 会报语法错误:SyntaxError: await is only valid in async functions。
正确用法包括:
- 在
async function中使用 - 在
async箭头函数中使用 - 在模块顶层(ES2022+ 支持
top-level await),仅限于 ES 模块环境
await 等待的不只是 Promise
await 会自动将右侧表达式转为 Promise:
- 如果值是 Promise,就等待它 settle(完成)
- 如果值是普通值(如字符串、数字、对象),
await会立即返回该值(等价于Promise.resolve(value)) - 如果值是
thenable(有then方法的对象),也会被当作 Promise 处理
例如:
async function f() {
console.log(await 42); // 42(立刻返回)
console.log(await Promise.resolve(100)); // 100
console.log(await { then: (r) => r('hello') }); // 'hello'
}
错误处理:用 try/catch 捕获 await 失败
await 遇到 rejected Promise 会把错误抛出,就像 throw 一样,所以要用 try/catch 捕获:
async function fetchUser() {
try {
const res = await fetch('/api/user');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.error('获取用户失败:', err.message);
return null;
}
}
不加 try/catch 会导致 Promise 被 rejected,调用方需用 .catch() 或外层 await + try/catch 处理。


















