00:00
Hello,大家好,那在上一个小节呢,我们完成了对resolve和reject这两个函数内部的一个结构的搭建,而这一个小节呢,我们来对它内部的功能代码做一个实现。我们首先先来分析一下这个resolve函数它执行完成之后有什么效果,这个咱们之前呢也介效果,只要resolve函数它一执行,首先promise对应的状态呢会发生改变,它会由pending呢转为field,另外一点的话,它可以设置这个promise对象成功的结果为OK,所以说这个resolve函数它现在咱们知道的啊,就做两个事情,第一个改变状态,第二一个是设置结果值,那好我们把这写上,第一个修改对象的状态,然后第二一个是设置对象结果值,那么这个状态是什么?
01:06
我们之前也介绍过,这个状态其实就是实力对象上的一个属性。这个属性的名字叫做state啊,叫promise state,那么下边呢,这个结果值它是由另外一个属性叫做promise result。啊,这是两个属性,所以说说是对对象的一个状态修改,其实就是在对属性去做修改,那好,那么这个promise state state state它是属于谁的,它是属于实例对象的,而且它还有起始值,但是咱们现在你看一下,我们现在去实例化这个P有promise state这个属性吗?没有啊,咱们是没有的啊,好了,为了看更加清楚一些,我呢把它先输出一下,用内置的看一看这个结果,右键打开,然后刷新一面。
02:10
点开它。你可以看一下,它里边有两个内置属性,第一个叫promise state,这个为状态,第二一个promise result为OK。啊,但是咱们这个现在肯定没有,为什么呢?因为压根就没加,那么怎么为一个实例对象去添加一个属性promise state呢?好,我们在这里做一下添加。属性用this.promise然后state等于通过这种形式为它去添加属性。那么这个状态呢?默认值是什么呢?默认值叫做pending啊,就是未决定的这样一个状态,好,这是一个属性,还有另外一个属性,咱们需要加promise result,咱们把它设置为空。
03:04
啊,你最开始的话没有做任何的初始值的设置。好了,那么这块做完之后,下边我就可以再对它做一个修改了啊,我们这写一个this.promise然后state state,然后等于一个resolved,当然了也可以写成full field。啊,在这的话,我们在之前笔记里边介绍过啊,Resolved和fieldd它们表示的意思是一样的,都是成功的意思,还有一个呢,是结果值promise result等于一个谁呢?就是这个data,就是你resolve传递进来的这个食参给塔放进来,放进来之后呢,咱们去看看结果它行不行啊,代码咱已经打开了啊Z方法现在跟他没有半毛钱关系,把它呢先注释掉。切过来刷新页面,然后点开,你看一下,你会发现一个问题。
04:03
诶按道理来说呢,应该变成就是fulfilled这块呢,应该变成OK才对,为什么咱们在实例化完成之后呢,这个结果依然是pending呢。这里主要是因为this出了问题啊,因为这个resolve在调的时候呢,是直接的去调用的,这个this的值呢,它是指向window的,我们可以打印一下这个值,然后点开刷新,你看它是指向window的,所以当你在进行这样的赋值的时候呢,你改的并不是实例对象,而是改的全局的window对象。那为了解决这个问题,我们可以呢,在这儿预先保存实例对象的那个this的值啊,Cost,我们写一个self等于一个this,当然这个变量你可以自由发挥是吧?常见几种形式的话,就是什么self,然后下划线Z还有that这几个变量用的比较多啊,当然你写ABC也没问题啊,这就是潜规则好了,下边在这呢,我就把它们替换掉啊,咱点开再看一看效果,刷新页面。
05:15
看事。看这啊,状态为field,然后呢,结果值为,OK,没有问题,好了,这是resolve的一个功能,那完成之后呢,下边咱们再把reject拿过来,也是一样,它只不过呢是把状态改成一个失败rejected,然后这块的话不用动啊,我们来看一看效果,来一个reject error保存。点开看一下状态为失败。然后呢,这个结果的值为error,没有问题,好了,这个小节我们就先到这,咱们这个小节是对resolve和reject功能呢,做了一个这样的实现。
我来说两句