async函数是语法糖,使异步代码呈同步风格:用await暂停当前函数执行(非阻塞),自动返回promise,await后非promise值会被包装;需用try/catch捕获错误,多请求应优先用promise.all并发。

async 函数本身不是“用同步写法写异步”的魔法,而是让异步代码**看起来像同步**——它通过 await 暂停函数执行(仅限当前 async 函数内),等待 Promise 完成,同时不阻塞主线程。关键在于:语法是同步风格,底层仍是异步机制。
async/await 的核心写法
把原本用 .then() 链式调用的 Promise 逻辑,改写成“一行一行往下写”的形式:
- 函数声明前加
async关键字(自动返回 Promise) - 在 Promise 前加
await(只能在 async 函数内使用) -
await后面跟的是 Promise,但写法上就像在等一个普通值
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// 传统 Promise 写法(异步风格)
fetch('/api/user')
.then(res => res.json())
.then(data => console.log(data.name))
.catch(err => console.error(err));
// async/await 写法(同步风格)
async function getUser() {
try {
const res = await fetch('/api/user'); // 看似暂停,实际非阻塞
const data = await res.json(); // 等上一步完成再执行
console.log(data.name);
} catch (err) {
console.error(err);
}
}
await 不是“阻塞”,只是“暂停执行”
await 不会让浏览器卡住或冻结 UI,它只是让当前 async 函数暂停,把控制权交还给事件循环。后续代码会在 Promise settle(fulfilled/rejected)后,作为微任务继续执行。
- await 后面如果不是 Promise,会自动包装成
Promise.resolve(value) - await 只暂停当前函数,不影响其他代码运行(比如定时器、其他 async 函数)
- 不能在普通函数或顶层作用域直接用 await(ES2022 支持顶层 await,但需模块环境)
常见误区与正确处理
容易误以为“写了 await 就等于同步执行”,但实际仍需按异步逻辑设计:
- 多个独立请求不要串行 await,该用
Promise.all()并发: - 错误必须用
try/catch捕获,因为 await 抛出的是同步异常(对应 Promise rejection) - 不能用
await包裹回调函数(如setTimeout(() => {}, 1000)),要先把它转成 Promise:
// ❌ 不必要等待(慢)
const a = await fetch('/a');
const b = await fetch('/b');
// ✅ 并发请求(快)
const [a, b] = await Promise.all([fetch('/a'), fetch('/b')]);
const sleep = ms => new Promise(r => setTimeout(r, ms)); await sleep(1000); // ✅
和普通函数混用要注意返回值
async 函数总是返回 Promise,即使你 return 一个原始值:
-
async function f() { return 123; }→ 实际返回Promise.resolve(123) - 调用 async 函数时,想拿到值必须 await 或 .then()
- 不要在非 async 函数里“忘记 await”,否则拿到的是 Promise 对象,不是结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










