这篇文章给大家分享的是有关承诺的实现思路是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
<强>承诺实现思路的个人理解强>
我一直觉得承诺虽然方便,但是它的写法很怪,无法理解实现承诺的人是如何思考的。
不过最近我对于实现承诺的思考过程的有了一点点个人理解,特此记下。
感觉这篇文章我还是没有把思路说清楚,时间紧张,就当做一次记录,回头我要把这个过程在表达的在清楚一点。
<强>用例强>
var p1=new Promise2((解决,拒绝)=比;{ setTimeout(()=比;{ 解决(& # 39;你好# 39;) },1000) } ) p1。然后(res=比;{ 控制台。日志(res + & # 39; & # 39;) 返回res + & # 39; & # 39; } ) 不要犹豫(res=比;{ 控制台。日志(res + & # 39;紫薇# 39;) 返回res + & # 39;紫薇# 39; })
我觉得实现一个函数跟封装组件类似,首先从以下几点考虑:
- <李>
1。这个函数用来做什么的?
李> <李>2。接受哪些参数
李> <李>3。返回值是什么
李>那么结合例子,和这几个问题,我们得到
- <李>
1。<强>承诺是做异步流程控制的。>强通俗说就是,我希望某个函数暂时不执行,等我希望它执行时,就解决一下,你这个函数在执行。
李> <李>2。<强>构造函数承诺接受一个函数。强>函数的参数是决心,拒绝,解决和拒绝也是函数,是给用户调用用的,当用户希望下一个异步执行时,就调用解决(0
李> <李>3。<强>返回一个承诺实例。强>承诺实例都有一个然后方法,而那方法也返回一个新的承诺实例。由此就可以链式调然后用了
李>先实现一个承诺(未实现然后的链式调用)引用><李>
1.承诺接受一个fn,不管其他,你觉得这个fn在内部会干嘛?只能被调用呗,所以虽然不知道怎么搞,但是先调用一下fn(解决,拒绝)
李> <李>2。那这个解决和拒绝不是用户实现的,所以肯定是承诺开发者实现的,那我们要实现解决和拒绝,它们是干嘛的,肯定用来是改变状态的,所以定义this.state
李> <李>3.解决和拒绝也会接受用户的参数吧,那我们就需要把这个参数用this.value缓存一下,将来然后方法调用时,需要传递进去
李> <李>4。然后接受successFn和errorFn,这2个就是我们希望暂时不执行的函数了。怎么做到暂时不执行呢?就是声明两个数组,把他们先存起来,将来解决时,在调用
李>类Promise2 { 构造函数(fn) { 这一点。successFnArray=[]//用来缓存successFn和errorFn 这一点。errorFnArray=[] 这一点。=& # 39;状态pendding& # 39; const解决=(res)=比;{//解决就做2件事情1:修改状态2:调用successFn 这一点。状态=& # 39;实现# 39; 这一点。值=https://www.yisu.com/zixun/res/this.value用来缓存数据数据或者错误 this.successFnArray。forEach (successFn=> { successFn (res) } ) } const拒绝=(err)=> { 这一点。状态=熬芫? 这一点。值=犯错 this.errorFnArray。forEach (errorFn=> { errorFn (res) } ) } fn(解决,拒绝)//先调用fn再说 } 然后(successFn errorFn) { 开关(这一点。状态){ 例“完成”: successFn(这一点。值)//如果调用了决心,状态就成了满足,就会执行successFn 打破 例“拒绝”: errorFn(这一点。值) 打破 例“悬而未决”: this.successFnArray。推动(successFn)//如果还没调用决心,状态就是挂件,就先把这些异步函数缓存起来。将来换时调用 this.errorFnArray。推动(errorFn) } } } var p1=new Promise2((解决,拒绝)=> { setTimeout (()=> { 解决(“你好”) },1000) } ) p1。然后(res=> { 控制台。日志(res +‘世界’) 返回res +‘世界’ })<>强实现然后链式调用强>
然后的实现,和金桥的链式调用不同,金桥是每次调用方法后,把这个返回
而承诺规范要求,每次都要返回新承诺的对象
所以只需要把那方法修改一下。
这部分可能会迷惑,但是我想先说一下这里做了哪些事情,其实变化不大
之前的那么做了哪些事情?
承诺的实现思路是什么