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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:42:36