promise链式调用通过每次.then()返回新promise并透传结果、强制回调入微任务队列、状态不可逆及缓存处理,确保异步时序一致与正确链式执行。

Promise 链式调用能解决回调函数异步执行问题,核心在于:每次 .then() 都返回一个新 Promise,并把上一步的返回值(或异常)**透传给下一个 then 的回调**,同时确保所有回调都进入微任务队列(如 queueMicrotask 或 Promise.resolve().then()),从而统一异步调度、避免同步阻塞和时序错乱。
确保 then 回调总是异步执行
即使上一个 Promise 已经是 fulfilled 状态,.then() 的回调也不能立即同步调用,否则会破坏“一致的异步时序”,导致竞态或难以预测的执行顺序。必须强制将其推入微任务队列:
- 用
queueMicrotask(() => {...})(推荐,语义清晰) - 或退而求其次用
Promise.resolve().then(() => {...}) - 不能用
setTimeout(..., 0)(属于宏任务,延迟更高,破坏 Promise/A+ 规范)
正确处理 then 返回值并链出新 Promise
每个 .then(onFulfilled, onRejected) 必须返回一个新 Promise,其状态由回调函数的返回值决定:
- 若回调返回一个普通值(如字符串、数字、对象),新 Promise 立即以该值 fulfilled
- 若回调返回另一个 Promise(或 thenable),新 Promise 等待它 settle,并继承其结果
- 若回调抛出异常,新 Promise 以该错误 rejected
- 若回调未提供(如
.then(null, onRejected)),需透传上一个 Promise 的成功值
区分 pending / fulfilled / rejected 状态,并缓存结果
Promise 实例一旦从 pending 变为 fulfilled 或 rejected,状态不可逆,且后续所有 .then() 都应拿到已确定的值或原因:
- pending 状态下,把 onFulfilled/onRejected 回调存入
onFulfilledCbs和onRejectedCbs数组 - fulfilled 时,遍历执行所有缓存的 onFulfilled 回调(全部异步)
- rejected 时,遍历执行所有缓存的 onRejected 回调(全部异步)
- 状态变更后,不再接受新的 resolve/reject 调用(忽略后续调用)
兼容同步 resolve 和异步 resolve 场景
构造函数中传入的 executor 函数可能同步调用 resolve(123),也可能异步调用 setTimeout(() => resolve(456), 10)。手写时需保证:
- executor 内部报错应直接 reject 当前 Promise(
try...catch包裹) - resolve/reject 函数内部要检查当前是否仍是 pending,再更新状态和值/原因
- 无论 executor 同步还是异步,所有
.then()注册的回调都遵循统一微任务调度逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











