promise链中then返回非promise值会自动包装为resolved promise,返回promise则传递其最终resolve值;不返回值默认返回undefined,链仍保持fulfilled状态;错误会向下游传递直至catch处理。

在 Promise 链中,如果某个 then 回调没有显式返回 Promise(比如返回普通值、undefined、对象、字符串等),它**仍然会返回一个已解决(fulfilled)的 Promise**,其值就是你返回的那个值。这个行为决定了后续链中状态和值如何传递。
非 Promise 返回值会被自动包装成 resolved Promise
当你在 then 中返回非 Promise 值时,JavaScript 引擎会隐式调用 Promise.resolve() 包装它:
-
return 42→ 等价于return Promise.resolve(42) -
return "hello"→ 等价于return Promise.resolve("hello") -
return undefined(即没写 return)→ 等价于return Promise.resolve(undefined) -
return { a: 1 }→ 等价于return Promise.resolve({ a: 1 })
返回 Promise 时,后续 then 接收其最终 resolve 值
如果你显式返回一个 Promise,那么下一个 then 的回调函数接收的是该 Promise **最终 resolve 的值**(不是 Promise 实例本身),且等待它完成:
-
return fetch('/api')→ 下一个then接收的是fetch成功响应的Response对象 -
return new Promise(r => setTimeout(() => r('done'), 100))→ 下一个then在 100ms 后收到'done' - 若返回的 Promise 被 reject,则跳过当前
then的成功回调,进入最近的catch或下一个then的失败回调
不返回任何值(或 return undefined)会导致值丢失但链不断
这是最容易被忽略的情况:如果 then 回调里没写 return,或写了 return;,它返回 undefined,后续 then 会收到 undefined,但链依然保持 fulfilled 状态:
Promise.resolve(1)
.then(x => { console.log(x); }) // 输出 1,返回 undefined
.then(x => console.log(x)); // 输出 undefined,不是 1
注意:这里第二个 then 并不会接收到上一个 Promise 的原始值(1),而是接收到前一个 then 的返回值(undefined)。
错误处理与状态穿透规则
Promise 链的状态走向遵循“成功向下传值、失败向下游找 catch”原则:
- 任意
then中抛出异常(throw)或返回被 reject 的 Promise → 当前 Promise 变为 rejected,跳过后续所有成功回调 - 如果没有
catch或带失败回调的then(onFulfilled, onRejected),错误会一直向后传递,直到遇到处理者 - 一旦有
catch捕获并正常返回(无论是否 Promise),后续链恢复为 fulfilled 状态,并把返回值往下传
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











