关于promise的几个认知

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于promise的几个认知相关的知识,希望对你有一定的参考价值。

1. 为什么要有promise

···从代码上来说回避了回调嵌套的问题,其次promise可以保留异步请求的状态(即使得到结果不立刻执行回调,过一阵再执行仍然是可以的。)

···从思想上来说,我们设计一连串事件abc的思路是,先做a,a行的话做b,a不行做f。b行的话做c,b不行那也做f。最后c行就成功了,c不行还是做f。原始的回调函数写出来是这样的思路:a行的话做b,b行的话做c,c行的话成功,c不行做f,b不行做f,a不行做f。那么Promise显然更符合自然逻辑。

 

2. promise的实现

http://www.tuicool.com/articles/fMJJBze

 

3.promise的回调为什么要在microtask中,在本轮event loop的最后执行,而不是像setTimeOut一样在下一轮event loop中执行?

promise有一个

···发送异步请求--根据结果调用resolve改变promise状态--再调用then的回调的过程。

传统方式是:

···发送异步请求--获得结果直接调用回调

所以promise是要多一步回调的。异步操作的回调肯定是在macrotask中在后一个event loop中执行,试想如果promise的回调也在macrotask中,那么这个异步操作从发出请求到执行最终then方法里的回调函数,就需要耽搁两次,这当中可能会有其他任务插进来,而第二次是没必要的。所以把promise的回调放在microtask中处理,可以确保在异步返回请求后的同一轮eventloop中执行,也就是把第二步和第三步合并在一起,于是又和传统方法一样等待一次即可。

以上是关于关于promise的几个认知的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 中的Promise --- $q服务详解

promise的基础认知及学习

Promise的九大方法(resolverejectthencatchfinallyallallSettledraceany)你都用过那些?

Promise的九大方法(resolverejectthencatchfinallyallallSettledraceany)你都用过那些?

实现Promise的first等各种变体

关于Promise