You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript Promise回调调度机制与链式错误传递原理问询

Promise链核心问题解答

先看给定的Promise链代码:

function getData() {
  return new Promise((resolve) => {
    // ...
  })
    .then((data) => data.someData)
    .then((rawData) => processData(rawData))
    .catch((err) => console.log(err));
}

问题1:then()/catch()的调度执行逻辑

  • then()方法本身是同步执行的,执行时会直接把你传入的成功/失败回调,注册到当前绑定的Promise实例内部的对应回调列表里(每个Promise实例都维护了fulfilledCallbacks和rejectedCallbacks两个队列)。
  • 当Promise的状态从pending变为fulfilled或rejected时,会把对应队列里的所有回调,包装成微任务推入微任务队列。等当前同步执行栈清空后,事件循环会依次执行微任务队列里的这些回调。
  • catch()本质就是语法糖,等价于then(null, 错误处理回调),所以它的调度逻辑和then()完全一致:同步注册回调到对应队列,状态变更时推入微任务队列执行。

问题2:错误沿Promise链传递的原理

  • 每个then()都会返回一个全新的Promise实例,这个新Promise的状态由以下规则决定:
    1. 如果前一个Promise成功(fulfilled),就执行then()的成功回调,回调的返回值会决定新Promise的状态(返回普通值则新Promise fulfilled,返回Promise则新Promise状态跟随这个子Promise)。
    2. 如果前一个Promise失败(rejected),但当前then()没有传入失败处理回调,那么这个then()返回的新Promise会直接变成rejected状态,并且把前一个Promise的错误原因作为自己的错误原因。
  • 这种机制就实现了错误的链式传递:链上只要有一个Promise变成rejected,后续所有没有处理错误的then()返回的新Promise都会继承这个rejected状态和错误,直到遇到一个处理rejected的回调(比如catch(),或者带失败回调的then()),错误才会被拦截处理。

内容的提问来源于stack exchange,提问作者kekerinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:32:48