Promise 的核心是用状态容器与链式响应替代回调嵌套,其本质为封装异步操作、持 pending/fulfilled/rejected 三种不可逆状态的执行容器,.then()/.catch() 返回新 Promise 构成可延续链条,async/await 是其语法糖,关键在于放弃手动串联、转向声明式组合与统一错误处理。

Promise 的核心原理,是用状态容器 + 链式响应替代层层嵌套的回调函数。它不改变异步本质,但重构了控制流——把“等一个完了再传给下一个”的手动传递,变成“上一个完成自动触发下一个”的声明式表达。
Promise 本质是一个有状态的执行容器
每个 Promise 实例内部封装一个异步操作,并持有且仅持有三种不可逆状态之一:pending(进行中)、fulfilled(成功)、rejected(失败)。创建时处于 pending;调用 resolve(value) 则转为 fulfilled 并记住 value;调用 reject(reason) 或抛出未捕获错误则转为 rejected 并记住 reason。状态一旦确定,就再不会变。
- 这种单向状态流转避免了回调里反复判断“有没有出错”“数据有没有拿到”
- 结果值(或错误原因)被绑定在 Promise 实例上,后续通过
.then()或.catch()按需取用,无需手动在每一层回调里传参
链式调用让流程线性展开
.then() 和 .catch() 方法返回的始终是新的 Promise,这就构成了可延续的链条。前一个 Promise 的成功结果,会作为参数直接交给下一个 .then() 的回调函数;任何一个环节 reject,都会跳过后续所有 .then(),直到遇到最近的 .catch()。
- 原来要写成
getUser(id, user => getOrders(user.id, orders => ...))的嵌套,现在可以平铺为getUser(id).then(user => getOrders(user.id)).then(orders => ...) - 错误处理集中化:一个
.catch()就能捕获整条链中任意位置的失败,不用在每个回调里重复写if (err) {...}
async/await 是 Promise 的语法糖升级
它没有新增机制,而是让 Promise 链的写法更接近同步代码。await 后面必须是 Promise,执行时会暂停当前 async 函数,等待该 Promise settle(完成或失败),然后继续向下执行。
- 多个
await默认顺序执行,逻辑清晰;需要并发时显式用Promise.all([p1, p2]) - 错误直接用
try/catch捕获,和同步代码一致,比链式.catch()更符合直觉 - 底层仍是 Promise,所以
async函数返回值自动包装为 Promise,可继续链式调用
关键不在“用了 Promise”,而在“放弃手动串联”
真正跳出回调地狱,不是简单把 function(err, data) 改成 new Promise(...),而是转变思维:
- 不再设计“下一步由谁调用”,而是定义“这一步完成后,下一步该做什么”
- 把异步操作当成可组合的值(Promise 对象),而不是必须立刻执行的函数调用
- 错误不是分散在每个回调里的分支,而是整个流程中可能发生的统一事件


















