promise链中返回值决定后续.then()接收内容:返回普通值则立即以该值执行成功回调;返回promise则等待其settled后传递终值;抛错或reject会沿链传递至最近的.catch()或失败回调。

Promise 链式调用中,返回值的处理方式直接决定后续 .then() 能接收到什么——它不是简单“传过去”,而是由 Promise 规范严格定义的自动转换逻辑。
返回普通值(数字、字符串、对象、undefined 等)
如果某个 .then() 回调函数返回一个非 Promise 的值(包括不写 return,即隐式返回 undefined),那么下一个 .then() 会**立即以该值为参数执行成功回调**。
-
Promise.resolve(5).then(x => x * 2).then(x => console.log(x))→ 输出 10 -
Promise.resolve('a').then(() => 'b').then(x => console.log(x))→ 输出 'b' -
Promise.resolve(1).then(() => {}).then(x => console.log(x))→ 输出 undefined
返回 Promise 实例
如果回调返回的是一个 Promise(无论新创建的,还是上游传来的),链会**暂停等待它 settle(fulfilled 或 rejected)**,再把它的终值(resolve 的值或 reject 的原因)传递给下一个 .then()。
-
Promise.resolve(3).then(x => Promise.resolve(x + 1)).then(x => console.log(x))→ 输出 4 -
fetch('/api').then(res => res.json()).then(data => console.log(data))→res.json()返回 Promise,所以第二个.then等它解析完才执行
返回已 resolve/reject 的 Promise
返回 Promise.resolve(10) 或 Promise.reject('err'),效果等同于同步返回对应值或抛错——但仍是异步微任务调度,不会阻塞主线程。
- 返回
Promise.resolve(10):下一个.then成功回调在本轮事件循环末尾接收 10 - 返回
Promise.reject('fail'):跳过后续所有成功回调,直接进入最近的.catch()或.then(null, err => ...)
错误与未捕获异常的传递
任何环节中抛出错误(throw new Error())、返回被 reject 的 Promise,或回调本身执行出错,都会使当前 Promise 变为 rejected 状态,并沿链向下传递,直到遇到 .catch() 或带失败回调的 .then()。
-
Promise.resolve().then(() => { throw 'oops' }).catch(err => console.log(err))→ 输出 'oops' - 漏掉
.catch()会导致“静默失败”——控制台可能报 unhandled rejection 警告










