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的状态由以下规则决定:- 如果前一个Promise成功(fulfilled),就执行
then()的成功回调,回调的返回值会决定新Promise的状态(返回普通值则新Promise fulfilled,返回Promise则新Promise状态跟随这个子Promise)。 - 如果前一个Promise失败(rejected),但当前
then()没有传入失败处理回调,那么这个then()返回的新Promise会直接变成rejected状态,并且把前一个Promise的错误原因作为自己的错误原因。
- 如果前一个Promise成功(fulfilled),就执行
- 这种机制就实现了错误的链式传递:链上只要有一个Promise变成rejected,后续所有没有处理错误的
then()返回的新Promise都会继承这个rejected状态和错误,直到遇到一个处理rejected的回调(比如catch(),或者带失败回调的then()),错误才会被拦截处理。
内容的提问来源于stack exchange,提问作者kekerinho
相关产品推荐
相关产品推荐

