小白认识Promise
首先我们需要知道的是Promise,是Es6新增的一个内置类,也就是一个构造函数,作用是用来规划异步编程代码,解决一直回调的问题(回调地狱的问题)。
我们说一下Promise的实例会有三个状态,而且所有实例只会是其中的一种状态:
pending等待状态; resolveed/fulfilled成功状态; rejected失败状态
实例的状态只能由等待状态转为成功状态或者失败状态,此过程不可逆,而且一旦发生改变就不会再变了。
- 一旦状态发生改变,后期就不会更改状态值了
如图实例p1先执行res(777),状态变为成功态,值为777;后面的rej(888)就会使p1实例的状态发生改变了,反之也成立,如果是rej(888)先执行了,实例p1状态变为失败态,值为888,后面的res(777)也不会使p1的状态发生改变。
- 如果promise报错,则把实例的状态修改为rejected,值是报错的原因
Promise的方法
then
then有两个参数[onfulfilled]和[onrejected]都是函数,实例状态是成功的时候执行[onfulfilled],并且把成功的结果传给它,失败的时候执行[onrejected]。把失败的的值作为结果传给它。
举个栗子吧
上图的执行结果是
因为实例p变成了成功态,所有执行then中的第一个回调函数then1,结果是成功态的结果, 同样要是p2中的rej(888)在前面那么就会执行then中的第二个回调函数then2,结果是失败态的结果。
catch
catch于then不同的是里面只有一个回调函数,被成为兜底错误的,就是上面的实例出现失败态的时候会执行,此错误不只是实例p2中的错误,也包p2then中出现的错误,我们用上面的栗子:
打印结果为
我们可以看出实例p2变为成功态,执行then中的then1函数,可是then1中出现报错,此时then2不会执行,那么控制页面会发生爆红,但是在后面加个catch就可以避免爆红,其实通过这个栗子我们也可以看出p2.then的执行结果也是Promise的实例。
finally
finally使用在最后
结果为
我们可以看出,无论成功还是失败 都要执行finally 一般不用finally