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
相关产品推荐
相关产品推荐

