00:00
哈喽,大家好,这个小节呢,我们来实现一下,在异步任务的情况下,Z方法返回结果的一个实现。这个异步任务呢,指的是执行器函数当中并不是同步去改变promise对象状态的。而是呢,是一个异步任务,我们还是一样用定时器做一个模拟。拿过来。好了,那么在这种情况下,我们可以先来看一看它的一个结果啊,内置的promise的一个表现。右键打开浏览器。然后咱们点开它看一看状态,你会发现呢,它的状态呢,跟Z返回结果的那个规则是一样的。啊,因为呢,我的回调函数这块呢,没有写return,默认返回值呢为onDeFi,这个onDeFi并不是一个promise,所以说res的结果是一个成功的promise对象。当然了,至于其他的,你返回promise啊,还有入抛出异常啊等等规则,人家都是满足的。
01:05
都是可以的,好了,那么接下来呢,我们来看看咱们这个行不行,点开右键刷新。然后呢,你看啊,这个回调已经执行了,咱们点开它看一看,那你会发现的这个状态呢,还是一个pending。啊,并没有转换成fulfilled。这是怎么回事呢?别急,咱们来分析一下啊,先看咱的代码点开。嗯,点开它,你看你在这里是一个异步任务,所以说当当这个new promise实例化对象完成之后。这个P对象在这个位置,它一定是一个pending状态的promise。既然是一个pending状态的promise的话,那么那在进到Z方法当中之后,它这个不会走,这个不会走,他会走这个。大家可以看一下,哎,走这个之后你会发现啊,在这个代码段当中,它没有调resolve,也没有调reject,所以说返回的promise对象一定是一个pending的。
02:08
而return这个promise刚好就是谁呀?Res。大家想一下,They return new promise。因为咱们这个代码段当中,在这块没有调resolve reject,所以res它的结果状态啊,就是一个pending。那么现在呢,我们说了啊,你不能是一个pen顶的,你得根据回调函数的执行结果来去决定它的一个状态。那么回调函数它最终是在哪执行的呢?咱们说了,最终是在上边的resolve和reject这个函数当中去执行的。好,所以说现在呢,在这个地方,我们单纯的去调这个回调就不行了。啊在这啊,你单纯去调这个回调是不行的啊,我们怎么办呢?我们这样来做,对他稍微做一下改进。
03:05
啊,稍微做一下改进啊好。你先看啊,我们先在这儿呢,打印一个这个success。然后呢,下边这个位置呢,打印一个error。打印这个干嘛呢?就是为了验证一点这个函数,它在状态改变为改变为成功之后,它会执行,而下边儿这个,当这个promise这样状态呢,在变成失败之后,它是会执行的。哪个对象呢?就是这个实例对象P。啊,大家可以看一下啊,我把这个也除掉,然后点开它。哎,好像不是这个文件,咱们重新打开一个。哎,走,再来一个。大家看这success d promised这个JS77行啊,点开它就是它。啊,所以说就是当你的状态在改完之后,咱这个函数就会执行。
04:05
啊,为什么执行呢?因为你看看看看这,你注意观察这。咱是把这个所有的成功的那个都取了出来。把所有成功的都取了出来,就是把这些resolved,这些成功的回调都取了出来,然后做一个调用。啊,所以说它是能够正常去执行的,那么正常能执行。这个咱们已经是能成了,问题是咱们在这个函数当中做什么事情。啊,做的事情是这样子,我们要执行。回调函数。啊,成功的回调函数。那么如何来执行这个成功的回调函数呢?你看啊,这个回调函数它在这儿保存着呢,所以说我们可以直接把它拿过来。然后呢,并且把这个成功的结果放进去,那么结果是谁呢?这个成功的结果呢,就是当前这个实例对象当中的。
05:01
那个叫promise result,那个值在这的话,咱们可以写this.promise result,但是呢,有一个小问题。啥问题呢,就是你这个this啊,好像有点问题。你看咱们这个this呢,是在这个对象当中,这个函数啊,这个函数在这个对象里边,所以this呢是指向这个对象的。好,为了能够准确的获取到咱这个实力对象,老样子。咱们先呢,保存一下this的一个值,然后在这呢拿过来。好,下边这个呢也是一样,当然在这你就不能调这个resolve了,应该调这个UN rejected保存。好了,咱们先去看一看他们能不能执行这个回调。点开它右键刷新。好,你看成功啊,这个OK,没有问题啊,他已经去执行了,不信的话,你可以再来输出一个别的内容,咱们来验证一下。
06:01
刷新。好,没有问题,它能够执行回调,执行回调这一步已经完成了,但是这个状态啊,它依然是没有变化的。你看它依然是偏定,那依然是偏定的话,咱怎么去改变状态来着啊,哎,咱说了要根据这一个函数的执行结果来去决定它的一个状态。又回来了。Let result等于它。我呢要获取你这个函数的执行结果,获取完成之后呢,下一步开始判断。If。Result啊,Instance of promise,检测你是不是promise的一个实例,如果是一种情况,如果不是一种情况,如果不是,那咱这个res状态就应该是成功的。啊,你要不是promise对象,那就是成功的,并且把你这个return的结果再放进来。那如果是呢?啊,如果是promise的话,那来吧,Then。
07:01
然后后边这个地方R。哎,然后你成功是吧,你成功我成功。啊,叫resolve的意思就是我要把返回的那个promise,就像它的状态呢,设置为成功。好,然后在这的话,Reject来一个R。搞定。我们来看一看效果怎么样,点开右键刷新。等好,然后点开它,你看这个状态就是翁field,然后它的这个返回值就是一个成功的值,就是那个返回值on find。那比方说我呢,在这儿return一个,其他纸return一个OK,或者咱们写一个o yeah。保存切过来右键刷新。然后呢?点开它,你看这翁fielded欧耶,注意,在这个地方有个细节,就是你千万不能直接去点开它。
08:00
你看我刷新把它点开。你要是直接点开它的话,查看的状态是改变之前的那个promise状态,也就是在这儿打印那个结果。你想想,当咱们代表同步向下这样去执行到这块位置,Res这个promise,就像它的状态是什么呀。的状态是一个pending。为什么呢?因为这个状态,这个代码还没执行,它的状态还没有定。它状态没有定的话,它执行哪个回调函数都是未知的回调函数没有去执行,那res这个对象的状态也是一个pending,所以说你直接去打开的话,那这个时候它是未改变状态之前的那个状态。所以说我们在这呢,在查看结果时要稍微等一下,要等到状态改变完之后再去点开,就能看到正确的结果了。好,那么成功这块咱们已经完成了,还有一个呢是失败的。啊,还有一个是失败的,那失败的话呢,我们在这儿来一个reject。
09:05
来一个error。你要是这失败的话,肯定走下边这个回调啊,走下边这个回调的话,你看它传递给谁了。传递给了这个unre rejected,然后呢,等状态改变完之后呢,他去执行unre rejected,我们得根据这个unre rejected执行结果来去改变状态。那你在这个函数里边没有去调resolve和reject,所以说这个res状态就一直是一个pending的,可以看一下。等一秒哎,然后点完之后,你看它还是盆底,那接下来的话,咱们就应该把这块呢实现一下。这个实验的方式跟上面代码是一样的。啊,是一样的啊,一模一样的。咱只需要呢,把这个unresolved变成谁啊,On rejected就可以了。好了,点开它右键刷新。等一下,然后点开,点fulfilled。
10:03
等一下啊,咱看咋回事。切过来。哦,很正常,为啥呢?因为咱这个函数里边也是return的一个onDeFi,所以说呢,它在这块的返回结果就是一个成功的promise对象,哎,这个表述有点小问题。什么问题呢?就刚才我说了啊,这个Z返回的结果是一个成功的promise对象,这句话不对,这句话应该怎么描述呢?应该是因为呢,咱这个返回结果是一个unDeFined,所以另方法返回的那个promise对形的状态。变成了成功。再说一遍啊,因为这个回调函数当中,它return是一个onde find,所以Z方法返回的那个promise句型的状态变成了成功,也就是说在最开始它的状态一定是一个pending的,就是当then运行完之后返回结果的时候,它的状态一定是一个pending的。
11:03
然后呢,等状态改完之后,他才把这个对象的状态变成了一个成功,是这样的一个情况。好了,那么在这的话,咱们还落了一点小东西,什么东西啊,就是我如果抛出异常怎么办呀。对不对,那抛出异常,咱这块你看。哎,当然咱们这块应该是在下边去抛出。啊,点开它。走,你看抛错的话,咱下边这个代码连执行都不执行了,所以说在这个地方呢,咱们应该把try catch还得给它补上。哎,你看这代码跟上面的代码写的是一样的,其实啊。往前推一下,在这地方你要是抛抛的话,就十百。来个E。然后呢,咱上边这个地方也得补上一个try catch。拿过来往这儿放。往前一推。这儿写上catch。然后reject。
12:01
再来看结果,点开右键刷新。嗯,等一下咱是方没有输出啊。我这儿去抛。啊,抛完之后呢,状态应该是要变成一个。啊,失败的。切过来啊,这块咱确实没有输出别的啊,这是对着的,然后点开它看这状态为失败结果值为抛出的值,Error没有问题。好了,到这儿的话,关于异步任务情况下Z方法的返回结果啊,它的一个特点咱们就已经实现了。啊,好了,那咱们这个小节就先到这儿。
我来说两句