【Promise】以例题理解resolve、reject和冒泡捕获机制

一、 resolve

*解释:看控制台最后输出,我们可以知道两点信息:

1、在new Promise传入的函数种,resolve之后,promise状态锁定在了[fulfilled],而不会因为后面的代码存在改变其状态。

2、两次then中第一个回调函数的参数res,都可以捕获resolve中的传值【then可以传参两个回调函数,第一个捕获resolve下的状态,第二个捕获rejected】

3、注意:resolve不可以出现在回调函数then中,没有任何意义

 二、reject和reject的捕获

 

*控制台出现报错,但是failed仍旧成功打印的解释:

1、在new Promise传入的函数种,reject之后,promise状态锁定在了[rejected],而不会因为后面的代码存在改变其状态。

2、在then 的回调过程中,第一个回调函数中的参数res接受的是resolve状态下的传值,所以无法成功console.log;而catch成功捕捉到了rejected的状态与传值

3、这里出现报错UnhandledPromiseRejectionWarning提示:

  • promise对象的两次then回调,是分开来的,不在一个捕获链上,所以这个报错是因为第一个then中的回调没有成功捕获并进行相应的错误处理,而出现报错提示
  • 可以看到后面的" 3 failed"依旧输出,因此这个错误不是致命的,不会影响脚本中其他内容的解释执行,只是相当于一个warning。Promise对于容器内部未处理的错误【不是发生在then中的错误,而是new Promise中的】会“吞掉”,让其不影响外部环境的顺利执行。
  • 但是如果在then中throw error而后面没有catch紧接着捕获,就会将错误冒泡到外部环境。

例子!:

我们可以看到,在处理完rejected状态后,又throw 了个err,下面控制台报错并且直接exit,并没有紧接着执行下一个setTimeOut函数中的内容【按照执行顺序,setTimeOut在微任务队列中排在promise.then后面,但并没有继续执行】

证明了上述理论,then中的错误抛出如果未被捕获,会中断外部执行,而new Promise中的错误会被吞掉,不影响执行,仅仅warning!

经过修改,不再报错 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_57208584/article/details/129648414
Recomendado
Clasificación