Promise链中中间Promise如何被拒绝?promise3拒绝promise4的底层机制
Promise链状态传递的底层逻辑解析
先看你给出的代码执行流程和状态流转:
Promise.resolve(6) // promise 1:初始已兑现,值为6 .then(function(data) { console.log('then 1:' + data); return Promise.reject(new Error('ups - rejected')); }) // promise 2:由第一个then返回的拒绝Promise决定,状态变为已拒绝,原因是Error对象 .then(function (data) { console.log('then 2:' + data); return data + 1; }) // promise 3:未指定拒绝回调,直接透传上一个Promise的拒绝状态 .then(function (data) { console.log('then 3:' + data); return data + 1; }) // promise 4:同样未处理拒绝状态,继续透传拒绝状态 .catch(function(error) { // 捕获promise4的拒绝状态 console.log(error); });
核心问题:promise3如何拒绝promise4?底层发生了什么?
1. 先记住then的核心规则
所有Promise.prototype.then()调用都会返回一个全新的Promise实例,这个新Promise的状态由两种情况决定:
- 如果then指定了对应状态的回调(兑现/拒绝):回调返回普通值则新Promise兑现,返回Promise则新Promise跟随其状态
- 如果then没指定对应状态的回调(比如当前Promise是拒绝状态,但then只传了兑现回调):新Promise会直接继承上一个Promise的状态和原因/值——这就是「状态透传」
2. promise3到promise4的状态传递过程
promise3本身是已拒绝状态(因为它透传了promise2的拒绝状态),而第三个then()只传入了兑现回调(打印then 3的函数),没有处理拒绝的逻辑:
- 因为promise3是拒绝状态,这个then的兑现回调根本不会执行
- 它返回的promise4会直接继承promise3的拒绝状态和错误原因,也就是promise4也变成已拒绝状态,错误还是
Error('ups - rejected')
3. 整个链的状态流转梳理
promise1(兑现)→ promise2(拒绝,由第一个then返回的拒绝Promise决定)→ promise3(拒绝,透传promise2状态)→ promise4(拒绝,透传promise3状态)→ catch捕获promise4的拒绝状态并执行回调
内容的提问来源于stack exchange,提问作者user19481364
相关产品推荐
相关产品推荐

