⚡ 30 秒速记
- 核心判断:
Promise是一个只允许单向决议的状态机,链式调用靠返回新实例传递值和错误 - 原理主线:围绕 「一、Promise基础用法」、「二、Promise实现原理剖析」、「核心机制」 建立输入、状态变化与输出之间的因果关系
- 文章范围:解析了JavaScript Promise的基本用法、三种状态(pending、fulfilled、rejected)、实现原理及其在异步编程中的应用,帮助读者全面理解Promise机制及其链式调用的实现方式。
- 边界与代价:状态一旦从
pending进入fulfilled或rejected就不能回退;回调执行还要区分同步决议与微任务调度 - 工程落地:工程上重点检查错误是否沿链传播、是否遗漏返回值,以及并发组合是否符合失败策略
Promise 本质上是一个状态不可逆的异步结果容器,通过 then 返回新实例实现值和错误的链式传递。 实例只能从 pending 变为 fulfilled 或 rejected,决议后不能再次改变。resolve 传入另一个 Promise 时会跟随它的状态,链路中抛出的错误则会向后传递到最近的 catch。工程中还要注意,极简实现里让 then 返回自身并不等同于完整规范,真正的链式调用需要处理返回值、异常和异步回调。
这篇文章不要按 API 清单来背。先用上面的 Mind Map 建立全局结构,再通过交互 DEMO 观察正常路径和边界路径如何改变状态;阅读正文时重点核对每一步的输入、负责执行的参与者、产生的中间状态以及最终可观察结果。遇到版本敏感结论,要把“历史实现”“当前行为”和“工程兼容策略”分开说明;遇到性能或架构取舍,则用实际指标、失败现象和验证手段支撑判断。
版本校准: 原理文章中的代码代表特定实现与写作时间。应用到当前项目时,应先确认浏览器、框架或工具的主版本,再区分稳定的规范语义、可变化的内部实现和项目自身约束。
# 一、Promise基础用法
# 1.1 基本用法
new Promise(function(resolve, reject) {
//待处理的异步逻辑
//处理结束后,调用resolve或reject方法
})
- 新建一个
promise很简单,只需要new一个promise对象即可。所以promise本质上就是一个函数,它接受一个函数作为参数,并且会返回promise对象,这就给链式调用提供了基础- 其实
Promise函数的使命,就是构建出它的实例,并且负责帮我们管理这些实例。而这些实例有以下三种状态:
pending: 初始状态,位履行或拒绝fulfilled: 意味着操作成功完成rejected: 意味着操作失败
pending状态的Promise对象可能以fulfilled状态返回了一个值,也可能被某种理由(异常信息)拒绝(reject)了。当其中任一种情况出现时,Promise对象的then方法绑定的处理方法(handlers)就会被调用,then方法分别指定了resolve方法和reject方法的回调函数