Promise.prototype.catch 本质上是语法糖,等价于 then(null, onRejected),因其内部调用 then(undefined, onRejected),而 then 对非函数的 onFulfilled 参数会透传成功值,故 catch 仅处理拒绝态且保持链式能力。

Promise.prototype.catch 本质上就是语法糖,它内部确实等价于调用 then(null, onRejected)。
为什么 catch 等价于 then(null, onRejected)
根据 Promise A+ 规范和 ECMAScript 标准,catch(onRejected) 的行为被明确定义为:
- 等同于
then(undefined, onRejected) - 而
then方法对第一个参数(onFulfilled)为null、undefined或非函数时,会透传成功值给下一个 Promise - 所以
catch(fn)只关心拒绝态,成功态原样向下传递,和then(null, fn)行为完全一致
手写 catch 的最简实现
在自定义 Promise 类中,只需一行:
return this.then(null, onRejected);
};
注意两个细节
-
then的第一个参数写null或undefined效果相同,但规范推荐用undefined;不过实践中null更常见且无差异 -
catch返回的是一个新 Promise,和then一样具有链式能力,错误处理后可继续catch或then
验证等价性的小例子
以下两种写法运行结果完全一致:
立即学习“Java免费学习笔记(深入)”;
promise.catch(err => console.error(err));promise.then(null, err => console.error(err));
如果 promise 成功,两者都不执行回调;如果拒绝,都执行 err 回调,且后续链式行为一致。


















