Promise返回内层拒绝态Promise未被外层catch捕获如何解决
问题根因
原代码存在三个核心问题,导致内层reject无法被外层catch捕获:
- Promise构造器传入的resolve函数(即代码里的
r)本身没有返回值,r('b').then()属于非法调用,会直接抛出类型错误,且这条链式逻辑和外层Promise完全独立,没有关联关系 - 执行
r('b')的瞬间,外层Promise的状态就已经被敲定为fulfilled,值为'b',后续的所有逻辑都不会影响外层Promise的状态 - 额外的拼写问题:catch回调的接收参数是
err,但打印时用了未声明的error变量,就算捕获到错误也会抛出引用错误
修复方案
有两种常用的写法可以实现需求:
方案1:将链式调用接在Promise实例后
这是最常用的标准Promise链式写法:
new Promise(r => r('b')) .then(() => Promise.reject('x')) .catch(err => console.log({err}))
执行逻辑:外层Promise resolve为'b'后进入then回调,返回的reject状态Promise会向上冒泡,被后续的catch块捕获,最终控制台打印{err: 'x'}。
方案2:resolve传入带链式的Promise实例
如果要把逻辑写在Promise构造器内部,可以直接让resolve接收一个Promise实例,外层Promise会自动等待该实例的状态敲定:
new Promise(r => r( Promise.resolve('b').then(() => Promise.reject('x')) )).catch(err => console.log({err}))
执行逻辑:resolve接收的Promise最终变为reject状态,外层Promise会同步该状态,触发外层catch块捕获错误。
内容的提问来源于stack exchange,提问作者Sherif eldeeb
相关产品推荐
相关产品推荐

