async/await 是 JavaScript 对协程思想的模拟实现,基于 Promise 的语法糖,通过暂停与恢复执行上下文实现异步流程的线性书写,简化嵌套、错误处理和控制流。
JavaScript 本身没有原生协程(coroutine)概念,但 async/await 是对协程思想的模拟实现——它让异步代码看起来像同步代码一样线性执行,同时不阻塞主线程。这种“类协程”机制,本质上是基于 Promise 的语法糖,配合引擎级的执行上下文暂停与恢复能力。
传统协程可在执行中途挂起、保存状态、让出控制权,之后再从断点恢复。JS 中的 async 函数正是这样工作的:
相比回调和 Promise 链,async/await 把“异步流程”还原成直观的“顺序逻辑”,关键简化体现在三方面:
.then() 或回调地狱。例如获取用户→订单→商品,可写成三行 await,而非三层嵌套try/catch 捕获异步错误,语义统一,不用在每个 .catch() 或回调里重复写错误逻辑JS 仍是单线程、基于事件循环的模型。async/await 不创建新线程,也不并行执行代码——它只是让“等待异步结果”的过程不卡住主线程,并把恢复执行这件事自动化了。所谓“协程感”,来自执行流的可控暂停与恢复,而非并发调度。
顺序请求三个接口的传统 Promise 写法:
fetch('/user')
.then(res => res.json())
.then(user => fetch(`/orders/${user.id}`))
.then(res => res.json())
.then(orders => fetch(`/product/${orders[0].id}`))
.then(res => res.json())
.catch(err => console.error(err));
用 async/await 重写:
async function loadUserOrderProduct() {
try {
const user = await (await fetch('/user')).json();
const orders = await (await fetch(`/orders/${user.id}
`)).json();
const product = await (await fetch(`/product/${orders[0].id}`)).json();
return product;
} catch (err) {
console.error(err);
}
}
逻辑清晰、调试友好、错误集中、易于扩展。