promise的then方法链式调用的核心是每次返回新promise,其状态由回调返回值决定:普通值则fulfilled,promise则跟随其状态,抛错则rejected。

Promise 的 then 方法支持链式调用,核心在于每次调用 then 都会返回一个新的 Promise,且该 Promise 的状态和值由前一个 then 回调的返回值决定——这是理解链式逻辑与规范行为的关键。
链式调用的本质:返回新 Promise
每次调用 then(onFulfilled, onRejected),无论原 Promise 处于什么状态,都会同步返回一个**全新的 Promise**(称为“下游 Promise”)。这个新 Promise 的终态不是继承上游,而是由对应回调函数的执行结果决定:
- 如果回调函数返回一个普通值(如字符串、数字、对象),下游 Promise 立即以
fulfilled状态兑现该值; - 如果回调函数返回一个 Promise,下游 Promise 将**跟随(follow)该 Promise 的终态**(即等待它 settle,并采用其值或原因);
- 如果回调函数抛出异常,下游 Promise 以
rejected状态拒绝该错误。
规范行为:Promise/A+ 规定的三类处理路径
根据 Promise/A+ 规范,then 必须按以下方式处理回调返回值(即“Promise Resolution Procedure”):
- 返回值为 Promise 实例:进入“同构解析”,下游 Promise 等待该 Promise 完成,然后复用其结果;
-
返回值为 thenable 对象(含
then方法):尝试调用其then方法,将其“适配”为 Promise 行为; -
其他情况(包括
undefined、null、原始值):下游 Promise 直接fulfill该值。
注意:即使前一个 then 的回调未显式写 return,它也默认返回 undefined,所以下游 Promise 会以 undefined 兑现。
错误传递与捕获:链中 catch 的实际位置很重要
catch(onRejected) 是 then(null, onRejected) 的语法糖,它只捕获**前面最近一个未被处理的 rejection**。链式中一旦某个 then 的成功回调抛错,或返回被拒绝的 Promise,错误会沿链向后传递,直到遇到第一个 catch 或末尾未处理的 reject:
-
promise.then(f1).then(f2).catch(e => {...}):能捕获f1或f2抛出的错误; -
promise.then(f1).catch(e => {...}).then(f2):catch后的then会接收catch的返回值(通常应返回新 Promise 或值),若catch内部没 re-throw,错误就已终止; - 避免漏掉错误:推荐在链末尾加
.catch(console.error),除非你明确知道所有可能 rejection 都已被处理。
常见陷阱与正确写法示例
以下写法易引发误解:
-
❌ 错误:在
then中直接调用异步函数却不 returnpromise.then(() => { fetch('/api') })→ 返回undefined,下游无法等待请求完成; -
✅ 正确:显式 return Promise
promise.then(() => fetch('/api'))→ 下游等待 fetch 返回的 Promise; -
❌ 错误:嵌套
then而非链式,导致作用域混乱promise.then(x => p2.then(y => ...))→ 返回的是内层then结果,外层无法统一处理错误; -
✅ 推荐:扁平链式,每个步骤专注单一职责
promise.then(parse).then(validate).then(save).catch(handleError)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











