async函数的本质是自动将返回值包装为Promise:正常返回值等价于Promise.resolve(),抛出异常等价于Promise.reject(),且必须返回Promise对象。
JavaScript 中的 async 和 await 是基于 Promise 的语法糖,让异步代码写起来像同步代码一样直观,但底层仍依赖事件循环和 Promise 状态机制。
async 关键字作用于函数声明或表达式,它会自动把函数返回值包装成一个 Promise:
return 42),实际返回的是 Promise.resolve(42);throw new Error()),等价于返回 Promise.reject(...);await 并不是阻塞线程,而是“暂停当前 async 函数的执行”,把控制权交还给 JavaScript 引擎,等右侧的 Promise settle(fulfilled 或 rejected)后再继续:
.then() 方法的对象),通常是 Promise;await p 的结果就是 p 的 resolved 值;try/catch 捕获,就会让整个 async 函数返回 rejected Promise;await 后面也可以跟非 Promise 值(如数字、字符串),这时会立即 resolve,等价于 await Promise.resolve(value)。await 在逻辑上等价于 .then() 的展开,只是更易读。例如:
async function fetchUser() {
const res = await fetch('/api/user');
const user = await res.json();
return user.name;
}
等价于:
function fetchUser() {
return fetch('/api/user')
.then(res => res.json())
.then(user => user.name);
}
区别在于:前者错误处理统一用 try/catch,后者需在每个 .then() 后加 .catch() 或最后统一捕获。
await(ES2025 起支持顶层 awai
t,但仅限模块内);await 是串行的——想并发执行多个异步操作,要用 Promise.all([await a(), await b()]) 改成 await Promise.all([a(), b()]);try/catch 包裹关键 await 表达式;await 不改变事件循环阶段,它只是让引擎在 microtask 队列中安排后续执行。