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

JavaScript中Promise.then的两种结果处理方式是否等价?

两个Promise的then处理方式是否等价?

问题描述

我是JavaScript新手,自学了Promise API(异步操作),但对then方法的结果处理尤其是拒绝状态的处理有些困惑。请问以下两个示例是否等价?

示例1:

promise.then(
  (result) => { 
     console.log(result);
  },
  (error) => { 
     console.log(error);
  }
);

示例2:

promise.then(
  (result) => { 
    if (result.ok) {
     console.log(result);
  } else {
     console.log('error');
  }
});

示例1使用then的两个参数分别处理resolve结果和reject错误;示例2仅在then的成功回调中通过if/else判断result.ok来区分情况。


回答

这两个示例完全不等价,核心区别在于它们处理的是Promise的两种不同状态逻辑:

1. 触发场景完全不同

  • 示例1的第二个回调专门响应Promise的reject状态:比如异步操作抛出代码错误、主动调用reject()方法时,这个回调才会执行,负责处理异步操作本身的失败。
  • 示例2的if/else只在Promise成功resolve后才会运行,它判断的是resolve返回结果对象里的ok属性,和Promise本身的拒绝状态毫无关系。

2. 未覆盖的场景差异明显

  • 当Promise进入reject状态时:示例1会捕获并处理这个错误;示例2不会执行任何回调,这个拒绝会变成未捕获的Promise错误,直接在控制台抛出异常。
  • 当Promise resolve的结果没有ok属性时:示例1会直接打印完整结果;示例2会因为result.ok被视为false,执行else分支打印error。

举两个具体场景验证:

  • 若promise = Promise.reject('网络请求失败'):示例1打印网络请求失败,示例2抛出未捕获错误。
  • 若promise = Promise.resolve({data: '返回内容'}):示例1打印{data: '返回内容'},示例2打印error。

总结

如果要区分异步操作本身的成功/失败(Promise的resolve/reject状态),用示例1的方式;如果是异步操作成功后,根据返回数据的业务状态做分支处理,才用示例2的逻辑,二者不能混为一谈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:15:58