定时器和promise_前端ES6中Promise的运行原理(四)

661c1f9284ae8ab45748ae4ad0cc96fc.png

前几篇文章,我们一起聊了Promise的运行原理,结合它的原理,我们再聊一下Promise上的几个静态方法的实现原理!

Promise.resolve和Promise.reject

96d756ce9df5a51b86bbb0bc008a56b5.png
demo1

结合之前说的原理,其实就是Promise.resolve返回的Promise对象作为parent,再去拼接下面then返回的Promise对象。Promise.reject也是一样的道理,这个比较简单,就不展开说了!

Promise.finally

finally静态方法和try catch中的finally一样,作为兜底,最终都会执行,实现也比较简单,看看下面的实现就可以了,也不多说了!

0c6cdf5dc286830c9bcfba367dafad2c.png
demo2

Promise.race

这个静态方法比较有意思,它的语义为竞赛,哪个先完成就使用哪一个!听起来很复杂,其实实现起来很简单!race方法的参数是一个数组,这些数组之间就是竞争关系,竞争谁的状态变化最快!

e0a5c74b413213d5bf0451e1200f1bb7.png
demo3

在运行时,promise会去遍历传进去的数组,并且把每一个数组元素(p1/p2/p3)都包装成一个promise对象,而且它们都被当做p的parent。(注意:p也是一个promise对象)

6c9ff19785a7d2d14edfb9087ea216f4.png
demo4

一旦P1、P2、P3中有一个Promise对象状态发生改变,它就会去改变P的状态,随之结果也会传递给P。当P的状态已经发生改变,那么它就不会再被外部的环境所影响,因此就达到了竞赛的效果。Promise对象的状态有且只能被改变一次。
运用场景:有时我们想要去请求一个图片(new Image.src),但是它没有超时的判断,我们想让它和ajax那样拥有超时截断能力,这时就可以让请求的操作和定时器做一次竞赛!

Promise.all

all也是接受一个数组参数,和race一样,这个方法是所有的参数都产生正向的结果,才会继续向下执行,这个方法的实现稍微有点复杂!我们稍微修改一下上面的demo。

67608d3ad534bf398e01bf86fca45a95.png
demo5

运行时,promise在遍历它们的时候会把它们封装成一个个的promsie对象。

ffb42c980350766a1f51ef3453947991.png
demo6

p1、p2、p3当他们各自状态改变时,它们并不会急于去修改p的状态,而是先把计数变量remain加1,再去查看remain的值是否和all中传入的数组长度相同(即保证所有的promise状态都已改变),如果remain==3(在这个例子里面是这样的),就会直接改变P的状态并且把p1、p2、p3运行的结果放在一个数组里面传给P,如果remain!=3,那就继续等待它们所有都完成。


注意:一旦当p1、p2、p3中出现了异常,那么就直接把那个异常给到P,不会再去等待其他promise的状态返回。

总结

这篇文章是关于promsie原理的最后一篇,聊到这里应该百分之七八十的东西都说完了,还有一点点细节其实是很难用通俗易懂的语言描述的,如果说出来,反而会让读者不容易懂。不能仅仅只有自己懂,也要让别人懂看懂,这样的分享才有意义。

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值