Promise 本质

发布时间:2026/7/24 18:46:51
Promise 本质 一句话高度概括Promise 是一套「异步状态管理模型」基于发布订阅模式用来封装异步操作提供统一规范来处理异步成功 / 失败结果它不是消除异步只是改造异步代码的组织形式。逐层拆解本质1. 底层核心状态机最根本Promise 内部维护有限状态机三种状态pending / fulfilled / rejected约束规则初始pending只能单向流转pending → fulfilled或者pending → rejected状态一旦落定永久不可修改多次调用resolve/reject无效。为什么要有状态机 回调函数最大痛点无法得知异步是否已经完成。 如果异步先执行完、回调后注册普通回调无法触发 Promise 通过状态记录结果异步未完成把.then的回调存入队列异步已完成直接立刻执行回调2. 实现模式发布订阅观察者模式new Promise(executor)executor 同步执行启动异步任务开发者调用resolve()/reject()→发布通知.then/catch注册回调 →订阅事件。内部维持两个数组onFulfilledCallbacks [] // 成功回调队列 onRejectedCallbacks [] // 失败回调队列流程异步还没结束then 传入的函数 push 进对应队列resolve 执行 → 依次取出onFulfilledCallbacks执行✅ 和普通事件总线区别事件只能触发一次状态凝固后后续订阅可以直接收到缓存好的值。示例差异const p Promise.resolve(123); // 哪怕promise已经成功后写的then依旧正常执行 p.then(res console.log(res))3. .then 链式的本质then()一定会返回全新的 Promise不是返回自身p.then().then().then() // 每一个.then都是一个新Promise实例内部逻辑捕获上一层回调返回值如果返回普通值 → 新 Promise 直接 resolve 这个值如果返回 Promise → 等待这个 Promise 完成再向下传递如果回调抛出异常 → 新 Promise 直接 reject。链式之所以能纵向书写、消灭回调嵌套根源就在每次都产出新 Promise持续提供 then 入口。4. 调度本质微任务规范要求then/catch/finally的回调必须异步执行微任务哪怕 Promise 已经完成回调也要放入微任务队列不能同步立刻执行。 目的保证代码执行顺序稳定避免同步 / 异步交替造成诡异 bug。Promise.resolve().then(()console.log(微任务)) console.log(同步代码) // 同步代码先打印5. Promise 解决了什么底层痛点本质价值原生回调模式缺陷回调嵌套回调地狱无法统一处理错误不能灵活组合多个异步并发、竞速无法二次订阅异步跑完回调来不及注册就丢失结果Promise 通过「状态缓存 标准化接口」解决上面问题。6. 容易踩的认知误区❌ 误区 1Promise 异步new Promise的 executor是同步执行的Promise 只是封装异步的容器本身不是异步。❌ 误区 2Promise 替代回调 Promise 底层依旧靠回调只是把回调从「参数传入」改成「链式注册」。❌ 误区 3async/await 脱离 Promiseasync/await是 Promise 的语法糖底层完全基于 Promise 实现没有 Promise 就不存在 await。面试精简口述版直接背诵Promise 本质是带状态机的异步结果容器基于发布订阅模式实现。 内部维护 pending、fulfilled、rejected 三种单向凝固状态 异步未完成时收集 then 注册的回调异步完成后触发回调队列 then 每次返回全新 Promise支持链式调用 规范强制使用微任务调度回调提供统一接口管理异步成功、失败解决传统回调地狱、异步结果无法复用、错误难以统一捕获等问题。