async/await 是用同步写法表达异步逻辑的语法糖:async 函数自动返回 promise,await 暂停执行等待 promise 结果,支持 try/catch 错误处理与 promise.all 等并行优化。

用 async 和 await 写异步代码,本质就是“用同步的写法,表达异步的逻辑”——它不改变异步本质,但让代码看起来像同步一样线性、易读。
async 函数:标记异步上下文
async 必须加在函数声明前,表示这个函数内部会使用 await,且自动返回一个 Promise:
- 即使函数体里没有
await,返回值也会被自动包装成 Promise; - 如果函数返回普通值(比如
return 42),实际等价于return Promise.resolve(42); - 如果抛出错误(
throw new Error()),等价于return Promise.reject(...)。
await:暂停执行,等待 Promise 解决
await 只能在 async 函数内使用,它会让 JS 引擎“暂停”当前函数的执行(注意:不是阻塞线程),等右侧的 Promise settled(fulfilled 或 rejected)后再继续:
-
await fetch('/api/data')看似像同步读取,实则底层仍是基于 Promise 的微任务调度; - 如果 Promise 被 reject,且没被
try...catch捕获,就会导致整个 async 函数返回 rejected Promise; -
await后面不强制是 Promise,非 Promise 值会被自动转为Promise.resolve(value)。
错误处理:用 try/catch 替代 .catch()
这是体现“同步风格”的关键:不用链式 .then().catch(),而是用熟悉的 try...catch 捕获异步错误:
async function loadData() {
try {
const res = await fetch('/api/user');
const user = await res.json();
return user;
} catch (err) {
console.error('加载失败:', err.message);
throw err; // 或返回默认值、重试等
}
}
并行执行:别滥用 await 串行化
想同时发起多个请求?不要写成这样(串行,慢):
const a = await fetch('/a');
const b = await fetch('/b'); // 等 a 完了才发 b
应先发起所有请求,再 await 等待全部完成(并行,快):
const [resA, resB] = await Promise.all([
fetch('/a'),
fetch('/b')
]);
-
Promise.all适合“全都要成功”; -
Promise.allSettled适合不管成败都要等结果; -
Promise.race适合只取最快的那个。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











