异步流程控制的核心是让代码在不阻塞主线程前提下按序执行、组合与错误处理;从callback到promise再到async/await,是表达时序与依赖的持续优化:callback轻量但易失控,promise用状态封装并支持链式与组合,async/await以同步语法降低认知负担。

异步流程控制的核心,是让代码在不阻塞主线程的前提下,按预期顺序执行、组合和错误处理。从 callback 到 promise 再到 async/await,并非简单替换语法,而是对“如何表达时序与依赖”这一问题的持续优化。
callback:直接但易失控
回调函数是最原始的异步表达方式——把后续逻辑作为参数传进去,等操作完成再调用它。它轻量、直观,适合单层异步任务:
- ✅ 优点:零抽象、无额外开销、理解门槛低
- ❌ 缺点:嵌套即失控——多个依赖步骤会形成缩进式嵌套(“金字塔”),错误需逐层判断,无法统一捕获,也无法 return 或 throw 控制流
- ⚠️ 典型陷阱:忘记检查 err、this 指向丢失、回调被多次调用、无法取消
Promise:用状态封装异步结果
Promise 把“等待中的异步操作”变成一个有明确状态(pending/fulfilled/rejected)和确定生命周期的对象。它不改变异步本质,但提供了可链式操作、可组合、可统一错误处理的接口:
- ✅ 链式调用:
.then()返回新 Promise,天然支持线性流程;.catch()可捕获链上任意环节的 rejection - ✅ 组合能力:
Promise.all()并发执行、Promise.race()响应最快、Promise.allSettled()不因某一项失败而中断 - ⚠️ 注意点:Promise 构造器内逻辑立即执行(不是懒加载);
.then()中若抛错,会自动转为 rejected 状态;未加.catch()的 rejection 会静默失败(现代环境会触发 unhandledrejection 警告)
async/await:同步写法,异步语义
async/await 是 Promise 的语法糖,让异步代码看起来像同步代码,极大降低认知负担。它没有引入新机制,底层仍基于 Promise 和事件循环:
- ✅ 可读性强:逻辑平铺直叙,await 后可直接使用变量,无需嵌套或链式传递
- ✅ 错误处理自然:用 try/catch 即可捕获 await 表达式的 rejection,与同步错误处理一致
- ✅ 控制更精细:可在任意位置 await、提前 return、配合 for 循环或条件语句灵活调度
- ⚠️ 注意点:await 只对 Promise 生效(其他值会被自动包装);函数必须声明为 async 才能使用 await;await 是暂停当前 async 函数的执行,不阻塞整个线程
三者不是替代关系,而是演进关系:callback 解决“能不能做”,Promise 解决“好不好组合”,async/await 解决“好不好读”。实际项目中,你仍会遇到基于 callback 的老 API(如 Node.js 的 fs 模块旧方法),也需熟练使用 Promise 封装或转换;而新代码,优先用 async/await 是清晰、健壮且符合现代实践的选择。











