00:00
哈喽,大家好,这一个小节呢,我们把执行器函数当中的任务呢,由同步变成异步。就是我们不直接去改变代码状态了啊。改变这个对象状态,而是呢,加一个这样的异步。Set time out。当然了,咱们现在也只拿一个定时器来做一个模拟,以后的话,它可能是一个文件的IO,也可能是一个数据库的IO,也可能是一个网络请求的IO,都有可能,总之呢,它是异步的,并不是立刻改变对象状态的。对于这种情况下,内置的promise,它是要求必须能够成功的执行回调才可以的,来演示一下。走起你看啊,人家这个OK,能正常输出,但是咱现在咱们这个行不行呢,咱也试一试点开。刷新。你看一下它不行啊,别说等一秒,你都等一个小时,它也不好使哈,那么这种情况下,为什么这个回调没有执行的,咱们先来分析一下。
01:08
代码呢,从上往下走。走到这块之后,这个resolve函数它没有执行,因为它得等一秒钟之后才能执行的啊,咱这同步代码肯定是不会等它,然后呢,再往下走去调这个Z方法。那么在调Z方法之前啊,P这个对象它的状态呢,没有变化,依然呢,还是初始化的pending状态,所以说在进到Z方法之中啊,进到Z方法里边之后,对状态进行判断。你发现这个呢是判断成功的,这个呢是判断失败的没有呢,对于判定状态做判断,所以说在Z方法里边,它这两个区,这两个判断呢,都是进不去的,不满足条件。所以说呢,咱们现在为了能够让这个回调函数呢,后续正常执行,咱们这儿还得再做一个判断。
02:02
来判断。Pending的一个状态。好,如果this.promise然后呢?State,它是等于一个pending。哎,咱们在这儿呢,做一些事情。问题来了啊,我们在这儿做什么事情呢?啊,这个很重要,咱们要回想一下就是。这个回调的执行时机。啊,回调的执行时机,如果说你是一个同步任务,立刻去改变了对象的状态,那这个回调的执行是在Z方法调的时候执行的。那么假如说他是异步的任务,那什么时候去执行回调呢?应该是改变状态的时候啊,改变状态以后再去执行回调,那么改变对象状态是在哪改变呢?点开看一下,我们是在resolve reject这两个函数内部去改变。
03:05
所以说以当前代码来为例的话,真正去调用回调函数的时机应该是在这个位置。啊,都用成功的回调函数,好,问题来了,我这儿怎么样能去调到这个函数呢?大家思考,我在这个位置怎么样能去调到这个函数呢?我调不到啊,现在这个情况调不到,你看一看这个函数是在Z方法当中是可以获取到的,而我们在这呢,是在resolve,或者说在promise这个构造函数内部呢,他们两个就不在同一个函数内部,不在同一个作用域下边。所以说现在为了能够让。Resolve内部呢,能够调到这个回调函数,我们在Z方法当中应该做一些事情。做什么事情呢?那就是保存回调函数。
04:04
注意这一点很重要。啊,就是保存回调函数,我现在在这个方法当中是绝对不能执行这两个回调的,为什么呢?因为状态不确定,状态不确定你擅自或者说直接去调的话,很有可能是错的,所以说这里我们要做的是保存。那这个保存这个这两个回调函数,我保存在哪呢。我能不能单独放一个变量去保存呢?比如说放最外层,我写一个call back。这样子行不行啊行,但是呢,这种保存啊,它不方便,而且不灵活。啊,这个就跟存零存这个私房钱一样子,我把私房钱存到别人那儿啊,存到外边这样子呢,往往是不安全的啊,容易产生混乱,那最好的方式是保存在哪呢?保存在自个儿身上。哎,就是保存在对象身上,所以说呢,我们现在呢,这样做为这个promise对象呢,咱们去加一个属性。
05:06
声明一个属性,This点空。Back等于一个对象。啊,this.call back等于对象,然后呢,我在下边保存,回调的时候呢,我把它放到里边,this.call back,然后等于。咱呢,把这两个成功,把这个成功和失败的咱都放进去啊,一个是unresolved,一个呢是unre rejected。这里我做了一个简写。啊做了个简写,就是建名啊叫unresolved简职是他。然后下面这个呢,键名是unre rejected,键值是它啊,这是一个简写,哎,这样吧,还还是写全吧。啊,防止呢。有这个困扰啊,写上。好,写完之后,接下来大家注意我在这儿呢,运行完Z方法之后,咱们来打印一下这个P,看一看这个对象身上到底有没有这两个回调。
06:09
打开。看这点开它,点开call back,你看这有了啊,Unre rejected还有呢,Unresolved就有了,那好有了之后。啊,有了之后,接下来的话,咱们可以在上边儿的resolve这个函数当中啊,就可以去执行这个成功的回调了。啊,执行成功的回调,如果哎,咱写一个this啊,当然写this不行啊,应该是self.call back.success。如果说你有啊,不能不是success啊,应该是unresolved。如果你这个回调当中有这个属性,那我就执行它。把它。拿过来放到这个位置。当然,光执行还不够。啊,你想啊,光执行不够,你还缺什么呀,缺参数,咱还得把参数传进去,这个参数呢,就是成功的结果,成功结果呢就是这个data,或者说是这个self promise result,它俩都一样啊,我把data放进来。
07:16
好,这是成功的,咱们先看效果怎么样,点开刷新。你看OK,就已经执行了。啊,当然成功完之后,咱们失败也得加一加。放到下边。哎,这是执行回调啊,咱们再来一个失败,把它变成一个reject error。保存点开。右键刷新。看一下E就出来了。好了,那这样一来的话,我们在异度任务情况下。啊,这个回调执行也就已经实现了,一定要注意这个回调的执行啊,它的它的执行位置不是在Z方法当中,而是在resolve里边。
08:02
啊,就是改变状态之后才能去执行回调呢。好的,那这个小节我们就先到这儿。
我来说两句