实现自定义 promise 的核心是用状态机约束异步执行路径,确保 pending→fulfilled/rejected 单向不可逆变更;then 方法按状态注册/触发回调并返回新 promise;catch 等价于 then(undefined, fn);需兼容 thenable 展开与微任务调度。

在实现自定义 Promise 时,流程控制的核心是**用状态机约束异步执行路径**,避免竞态、重复调用和状态非法跃迁。关键不在于写多少 if-else,而在于让 pending → fulfilled 或 pending → rejected 的转换不可逆、可预测。
状态只能单向变更,且仅允许一次决议
Promise/A+ 规范强制要求:状态一旦从 pending 变为 fulfilled 或 rejected,就不可再变。这是所有分支逻辑的基石。
- 内部用一个私有变量(如
state)记录当前状态,初始为'pending' - 每次调用
resolve()或reject()前,先判断state === 'pending';否则直接 return - 决议后立即更新
state,并保存值(value)或原因(reason)
then 方法需区分同步/异步执行,并缓存回调
then 不是立刻执行回调,而是注册监听器——它必须适配 Promise 当前状态,并决定回调是立即调用还是延后入队。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若当前为
fulfilled:把onFulfilled加入微任务队列(如queueMicrotask(() => {...})),保证异步性 - 若当前为
rejected:同理处理onRejected - 若仍为
pending:将回调暂存到数组(如onFulfilledCbs),等后续决议时统一触发 - 注意:每个
then都要返回新 Promise,实现链式调用和值穿透
错误冒泡与 catch 的等价性要靠统一拒绝处理
catch(fn) 本质是 then(undefined, fn)。流程控制中需确保:任意环节抛出异常,都会被最近的 onRejected 捕获,未捕获则继续向下传递。
- 在执行
onFulfilled或onRejected时,用try...catch包裹 - 若回调中抛错,直接调用下一个 Promise 的
reject(err) - 若回调返回值是 Promise,则等待其决议结果,再决定调用
resolve还是reject
resolve 参数需兼容 thenable 对象,触发展开逻辑
规范要求:当 resolve(x) 中的 x 是 thenable(即有 then 方法的对象),应“展开”它,而不是直接当成值。
- 检查
x !== null && typeof x === 'object' || typeof x === 'function' - 再尝试取
x.then,若可读且是函数,则以x.then(resolve, reject)执行,进入递归决议流程 - 这个分支容易遗漏,会导致嵌套 Promise 无法正确链式流转
不复杂但容易忽略:所有状态变更和回调触发都必须走异步调度(微任务),哪怕当前已是 fulfilled;否则同步执行会打破 Promise 的一致时序模型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










