promise.then 的执行结果决定后续 .then 的输入值和执行时机:返回普通值则立即触发下一个 then;返回 promise 则等待其 settle 后再继续;抛出错误或返回 rejected promise 会跳过后续 onfulfilled 并冒泡错误;不返回值则默认传递 undefined。

Promise.then 的执行结果直接决定后续 .then 的输入值和执行时机,不是简单“往下传”,而是通过新 Promise 的状态切换来驱动整个链路。
返回普通值:立刻触发下一个 then
如果回调函数返回一个非 Promise 的值(比如字符串、数字、对象),当前 .then 返回的新 Promise 会立即进入 fulfilled 状态,该值就成为下一个 .then 的参数。
- 例如:
Promise.resolve(1).then(x => x + 1).then(console.log)→ 输出 2 - 这个过程是同步完成的:计算出 2 后,引擎马上把下一个 .then 回调注册为微任务
返回 Promise:等待它 settle 后再继续
如果回调里 return 了一个 Promise(或 thenable),那当前 .then 返回的新 Promise 就会“跟它绑定”——它的状态由这个返回的 Promise 决定,后续 .then 要等它完成才执行。
- 例如:
Promise.resolve().then(() => fetch('/api')),fetch 返回的是 Promise,所以下一个 .then 要等网络请求响应后才运行 - 这相当于把异步操作嵌套进链中,但不会阻塞主线程,只是推迟后续微任务的入队时间
抛出错误或返回 rejected Promise:跳过后续 onFulfilled,触发错误处理
只要回调中 throw 错误,或 return 一个已被 reject 的 Promise,当前 .then 返回的新 Promise 就变成 rejected 状态,后续所有没提供 onRejected 的 .then 都会被跳过,直到遇到 .catch 或带第二个参数的 .then。
- 例如:
Promise.resolve().then(() => { throw 'oops' }).then(x => console.log('不会执行')).catch(err => console.log(err))→ 输出 oops - 错误不会消失,而是沿着链向下“冒泡”,靠微任务机制确保错误处理器也在本轮事件循环中执行
不返回任何值(或只写 return):默认传递 undefined
JavaScript 规范规定,如果回调函数没有显式 return,或只写 return;,它就隐式返回 undefined。这个值会作为下一个 .then 的输入。
- 例如:
Promise.resolve(5).then(() => {}).then(x => console.log(x))→ 输出 undefined - 这点容易被忽略,但对数据流完整性很重要——链不会中断,只是传了个空值











