Promise 的 then 方法链式传递的核心在于每次调用都返回一个全新 Promise,其状态和值由回调函数的返回值或异常决定,并据此触发下一个 then 的 onFulfilled 或 onRejected。

Promise 的 then 方法能实现链式传递,核心在于它**总是返回一个新的 Promise 对象**,而不是原地修改或返回旧的 Promise。这个新 Promise 的状态和值,由当前 then 中回调函数的执行结果决定。
then 返回新 Promise,不是原 Promise
每次调用 then 都会创建并返回一个全新的 Promise 实例。这意味着:
- 前一个
then的返回值(无论是普通值、Promise 还是抛出错误)会作为下一个then的输入依据 - 链式调用中的每个
then都独立作用于上一个 Promise 的“结算结果”,互不干扰 - 即使你不写
return,JavaScript 也会默认返回undefined,从而让下一个then接收到undefined
返回值决定下一个 then 的行为
当前 then 回调的返回值类型,直接影响链中下一个 then 的触发时机和参数:
- 返回一个普通值(如字符串、数字、对象)→ 下一个
then的onFulfilled会立即以该值为参数被调用 - 返回一个已 resolve 的 Promise → 下一个
then等待该 Promise 完成后,再用其值调用onFulfilled - 返回一个 pending 的 Promise → 下一个
then会等待它 settle 后再执行 - 抛出异常或返回被 reject 的 Promise → 下一个
then的onRejected被调用(除非中间有catch或then(null, ...)捕获)
错误会沿链向下传递,直到被捕获
链式调用中一旦发生 rejection(包括 throw 或返回 rejected Promise),后续没有 onRejected 处理的 then 会跳过 onFulfilled,继续向后传递错误:
-
promise.then(f1).then(f2).catch(e => {...}):错误会跳过 f2,直接进入catch -
promise.then(f1).then(null, e => {...}).then(f3):错误在第二个then被处理后,若它返回正常值,f3 仍可执行
手写简易 then 的关键逻辑(示意)
简化版实现需注意:新 Promise 的状态由回调执行结果驱动,且要兼容同步/异步场景:
- 如果当前 Promise 已 resolve,立即异步执行
onFulfilled(用queueMicrotask或Promise.resolve().then) - 回调执行后,根据返回值决定新 Promise 是 resolve 还是 reject
- 若回调本身抛错,新 Promise 直接 reject 该错误
- 如果当前 Promise 还在 pending,把回调存入队列,等 settle 后统一触发











