Promise 的每个 then 必须返回新 Promise,以确保链式调用的可靠性、状态不可变性、值穿透与错误传递的统一处理、避免共享副作用及竞态问题,并使 catch 能精准捕获前一步错误。

因为 Promise 的设计原则要求每个 then 调用必须返回一个独立、可被单独观察和处理的新 Promise,这样才能保证链式调用的可靠性、隔离性和可预测性。
确保状态不可变
Promise 一旦进入 fulfilled 或 rejected 状态,就不可更改。如果 then 直接复用原 Promise,后续操作可能意外干扰已有状态或结果。返回新 Promise 意味着每次 then 都在创建一个“快照”后的独立上下文,原始 Promise 的状态和值不受影响。
支持值穿透与错误传递
当 then 回调中没有显式返回值,或返回非 Promise 值(如字符串、数字),新 Promise 会以该值 fulfilled;若返回一个 Promise,则新 Promise 的状态由它决定;若回调抛出异常,新 Promise 会以该错误 rejected。这种统一的归一化行为,只有靠返回一个全新 Promise 才能实现。
-
promise.then(() => 42)→ 返回 fulfilled(42) 的新 Promise -
promise.then(() => Promise.resolve('ok'))→ 返回那个 Promise 的“代理”新 Promise -
promise.then(() => { throw new Error('boom') })→ 返回 rejected(new Error('boom')) 的新 Promise
避免共享副作用与竞态问题
多个 then 链可能并行监听同一个 Promise,如果它们共用内部状态(比如共享 resolve/reject 函数或缓存结果),就可能引发时序错乱或重复执行。每个 then 返回新 Promise,相当于为每条链分配专属的处理通道,天然隔离执行路径。
让错误捕获有明确边界
catch 实际是 then(null, onRejected) 的语法糖。只有每个 then 产生新 Promise,catch 才能精准捕获它前面那一步抛出的错误,而不是跳过中间环节或捕获上游未处理的旧错误。这使得错误传播路径清晰可控。
不复杂但容易忽略:这个“总是返回新 Promise”的机制,不是为了炫技,而是 Promise 作为异步抽象的核心契约——它让组合、复用、调试都变得可预期。


















