then 方法必须返回新 Promise,以保障链式调用的可组合性、状态与值的可控派生、避免共享状态副作用,并兼容 thenable 对象及统一调度机制。

因为 then 方法的设计目标就是支持链式调用和状态隔离,它必须返回一个新 Promise,而不是修改原 Promise —— 这是 Promise 规范(Promises/A+)的核心约定。
保证链式调用的可组合性
每个异步步骤的结果应能自然传递给下一步,而不会干扰上游逻辑。如果 then 直接复用原 Promise,就无法表达“上一步成功后做 X,X 完成后再做 Y”这样的时序依赖。
- 返回新 Promise,才能让
.then(...).then(...).catch(...)每一环都拥有独立的状态和值 - 例如:
Promise.resolve(1).then(x => x + 1)返回的是状态为 fulfilled、值为2的新 Promise,不是原来的那个 - 这样后续的
.then才能可靠地接收2,而不是原始的1
实现状态与值的可控派生
新 Promise 的状态不继承原 Promise,而是由回调函数的执行结果决定 —— 这种“派生”逻辑只能靠新建实例承载。
- 回调返回普通值(如
42或"done")→ 新 Promise 立即进入 fulfilled 状态,值为该返回值 - 回调返回另一个 Promise → 新 Promise 状态与之同步(pending → fulfilled/rejected)
- 回调抛出异常 → 新 Promise 进入 rejected 状态,理由为该错误
- 原 Promise 被 reject 但
then只写了成功回调 → 新 Promise 会变成 rejected(未捕获错误穿透)
避免共享状态引发的副作用
Promise 状态一旦 settled(fulfilled 或 rejected)就不可变更。若 then 复用原实例,多个 then 调用将竞争同一状态,导致行为不可预测。
- 比如两个
.then同时注册在同一个 pending Promise 上,它们本应各自独立响应,而非互相覆盖 - 实际中:
p.then(a).then(b)和p.then(c)是两条独立链,a的执行不影响c的输入 - 这种隔离性只有靠每次返回全新实例才能保障
兼容 thenable 对象与统一调度机制
规范允许 then 接收非 Promise 的 thenable(含 .then 方法的对象),新 Promise 实例作为标准化“出口”,确保所有分支最终都能被微任务队列统一调度。
- 无论回调返回的是数字、Promise、thenable 还是抛错,都由新 Promise 封装成标准异步单元
- 这使得
async/await、Promise.all等高级 API 能一致处理各种返回形态











