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

为何该Promise链式调用代码输出为Error 1、Success 4?

代码输出为Error 1、Success 4的核心原因

前置:Promise 链式调用的关键规则

  • 链式调用中每次.then()/.catch()的返回值,本质是一个全新的Promise,后续链路的执行完全由这个新Promise的状态决定,和最外层的初始Promise状态相互解耦
  • 当链路中出现rejected状态时,会从状态变更的位置开始向后匹配第一个能处理该错误的节点(即绑定了错误回调的.catch(),或者同时传入成功、错误两个参数的.then());中间所有仅绑定成功回调的.then()节点,会直接跳过、不执行对应逻辑
  • 如果错误处理节点(catch)内部没有主动抛出异常、也没有返回一个rejected状态的Promise,那么这个处理节点执行完成后,后续链路传递的状态会变回fulfilled,可以正常执行后续绑定的成功回调

逐节点执行流程拆解

  1. 初始状态:job() 内部创建Promise后立刻执行reject(),初始Promise的状态直接变为rejected
  2. 链路前三个.then()节点:三个节点都只传入了成功回调,没有配置错误处理逻辑,接收到上游传递的rejected状态时,会直接把错误向后透传,全程跳过对应回调,不会打印Success 1、Success 2、Success 3
  3. 链路的.catch()节点:这是链路中第一个匹配到rejected状态的错误处理节点,会执行内部逻辑打印Error 1;由于该回调内部没有抛错、也没有返回失败状态的Promise,这个catch节点返回的新Promise状态变为fulfilled
  4. 链路最后一个.then()节点:接收到上游传递的fulfilled状态,正常执行回调打印Success 4

常见误区:不少人会觉得catch之后所有后续的then都不会执行,实际上catch只是在错误传递的路径上拦截了一次错误,只要拦截后没有新的错误抛出,链路就会回到正常的成功执行轨道。你可以做个简单验证:如果在打印Error 1的catch回调里加一句throw new Error('test'),那后面的Success 4就不会打印,链路会把新抛出的错误继续向后透传。


内容的提问来源于stack exchange,提问作者Akhil-Sharma02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 15:54:03