Promise两种catch使用方式的等价性及链式调用原理咨询
Promise两种catch使用方式的等价性及链式调用原理咨询
嘿,很高兴你在深入钻研Promise的细节,这可是JavaScript异步编程里的核心知识点哦!咱们一步步来拆解你的问题:
一、版本1和版本2不等价
这两种写法看似相似,但背后的执行逻辑有关键区别:
- 版本1中,你是给同一个Promise实例
pr分别绑定了then(成功回调)和catch(失败回调)。这两个回调相互独立,各自只监听原Promisepr的状态变化。 - 版本2中,你是用链式调用的方式,把
catch绑定在了then方法返回的新Promise实例上,而非原Promisepr。
二、版本2的工作原理&关于then返回Promise的问题
首先明确:then方法确实会返回一个全新的Promise实例,这正是Promise链式调用的核心机制。
版本2的执行流程是这样的:
- 当原Promise
pr被resolve时,会执行then里的成功回调;回调执行完成后,then返回的新Promise会根据回调结果决定状态——如果回调正常返回,新Promise就resolve这个返回值;如果回调抛出错误,新Promise就reject这个错误。 - 当原Promise
pr被reject时,then里的成功回调会被跳过,直接触发后续链式的catch回调。因为catch本质上是then(null, 错误回调)的语法糖,它会捕获整个链条中前面环节(包括原Promisepr的reject、then回调里抛出的错误)产生的所有错误。
直观的差异示例
如果我们修改then的回调,让它抛出一个错误:
// 版本1修改后 const pr = new Promise((resolve, reject) => { resolve("Promise resolved"); }); pr.then((resolve) => { console.log(resolve); throw new Error("then回调里出错了"); }); pr.catch((error) => console.log(error));
运行这段代码,控制台会打印Promise resolved,然后抛出一个未被捕获的错误Error: then回调里出错了——因为版本1的catch只监听原Promisepr的错误,then回调里的错误属于then返回的新Promise,原pr的catch管不到。
而版本2的写法:
// 版本2修改后 const pr = new Promise((resolve, reject) => { resolve("Promise resolved"); }); pr.then((resolve) => { console.log(resolve); throw new Error("then回调里出错了"); }) .catch((error) => console.log(error));
运行后控制台会打印Promise resolved,接着打印Error: then回调里出错了——链式的catch成功捕获了then返回的Promise的错误。
备注:内容来源于stack exchange,提问作者jay26
相关产品推荐
相关产品推荐

