00:00
Hello,大家好,这一个小节呢,我们来封装一下promise当中的另外一个方法,那就是catch方法。Catch方法呢,我们之前介绍过,它呢用来指定失败的回调函数。我们来先来演示一下p.catch。然后reason。Consult their warm,打印一下这个reason。OK,搞定,先看看内置的,右键打开浏览器。看结果。大家可以看一下啊,那么19行已经是正常的输出了,没有问题,那这个时候你可以再看看咱的,咱这个行不行,刷新一面不行啊,报错啊,说p.cash is not a function,说兄弟这不是个函数啊,那报错原因很简单,就是因为咱们压根就没有去声明,也没有去添加这个catch方法,所以说咱们现在的话来添加一下这个。Catch方法。
01:00
Promise,点点catch。他呢,接受一个参数就是失败的回调,所以说写一个unre rejected。然后在里边呢,要做对应的事情啊,它的返回结果呢,也是一个promise对象,所以这块呢比较简单,我们可以直接去调用Z方法就可以了。因为Z方法呢,功能都已经实现了,而且呢,它能够指定两个回调,咱们呢,可以在这儿这样子。就第一个参数呢,我给你来一个unDeFined。第二个参数呢,我给你来一个unre rejected。好了,看看效果,点开它刷新页面。好能执行,并且这个返回结果啊,它也是一个promise对象。啊,我们是一个res。保存,点开它。然后等一下,然后点开好看状态这块是富翁fieldd的,没有问题。
02:02
好了,那么除了这个之外呢,咱们还要去实现另外一个功能呢,就是异常穿透。什么是异常穿透呢?咱们之前介绍过,就是在链式调用的过程当中啊,中间的这些任务呢,不需要去对失败的结果做处理,只需要在最后加一个catch方法去处理失败的结果就可以了。我来给大家演示一下。p.Z。然后呢,Value。然后下边的话再来z value。啊,在这儿载着点。好,那到最后的话,咱们补一个catch。啊,Consult log打啊,War。打印一下这个reason搞定,那中间这块的话,我们就直接输出一些111。然后222。然后这块再来一个333。搞定啊,那现在咱们先看内置的,把这个呢咱住掉。
03:01
点开右键刷新。你可以看一下二十五行能够正常的去输出啊,对第一个promise它失败的结果做了一个处理。那你再看咱这个行不行。打开保存。然后右键运行。好,你会发现啊,他二十五行也给咱们报了这个提醒了,但是这个提醒的错误呢啊,不太对劲是吧,他这不太对劲啊,正常来说应该是输出OK才对,但是他给我们来了一个说unre rejected is not a function。报了一个这样的错,为什么会这样子呢?我来给大家分析一下,你看这啊,当你这个对象呢,他失败之后。他呢,就是一定会去干嘛,一定会去执行对应的回调。啊,首先咱们先别到后边,咱们先到这个同步到这个阶段先分析一下。你执行完这个new promise之后,这个P啊,它一定是一个pending状态的。
04:00
所以在调任方法的时候,它要对这个回调函数做一个保存。第一个第二个都要保存,第一个成功,它有第二个没传,没传的话,它就是一个unDeFined,所以说这个Z方法调完之后,它返回的那个。Promise呢是一个pen,且这个回调函数。注意,这个回调函数是会保存在P这个对象的那个属性上面的。而且他失败的回调是一个unDeFined,好,记住啊,他失败的回调是一个unde,因为第二个参数没有传,那当他的状态改完之后。当他的状态在改完之后,他一定会去调这个调这个回调。在调回的时候呢,你会你会发现这个item里边啊,只有成功的,它没有失败的。所以说你再去调失败的时候呢,它是一个unDeFined,所以它不是个函数,这个时候就会报错。那么一旦报错的话啊,他返回的结果就会变成一个失败的promise,那这个Z呢也是一样,他这个第只有第一个成功的,第二个也没有,他也会报这个错,一直报报报报到最后由catch。
05:12
去处理了他们失败的那个结果。好了,那所以说产生问题的原因就在于Z方法当中啊,它并没有传递第二个回调函数。当然了,这个内置的promise是允许用户在使用这个Z方法的时候不传的,所以说我们在进行封装时也要允许用户可以不穿第二个回调。但是他不传啊,不代表它没有啊,如果真的没有的话,OnDeFi肯定是过不去的,所以说在这儿我们做一个这样的事情,那就是判断回调函数。啊,这个参数。如果。啊,Type of UN rejected,它要是。不等于一个函数。注意啊,你等于函数,那你就可以继续,如果说你这一块不等于函数,我就需要为你呢去创建一个这样的。
06:06
初始值或者是或者说是默认值,好,我们来写一下啊,我们来一个UN rejected就应该等于一个。然后写一个这个reason。啊,来一个reason。你想一想,如果你没传,相当于就是为你加了一个这样的回调。加了一个这样的回调会怎么样呢?加了一个这样的回调就代表说,哎,你这失败是吧,到我这来,哎我这儿呢,直接给你抛。我抛完之后,后边呢,他返回结果也是个失败的,下边接着走走失败没传没传,还是这样一个结果也抛。啊,就跟那个抛绣就是传绣球一样的,一点一点传,传传传一直传到最后。那到最后的话,开始方法就可以把这个结果给我们搞定。好了,那么咱们来看一看效果怎么样啊,我把先把这个给你删掉。
07:02
点开它右键刷新。你可以看一下二十五行就正常的输出了,而且呢,不光如此啊,不光是光他。失败就中间的,比方说你这写一个OK啊,OK的话,他可以走这些地方对不对,如果说这期间这些Z方法当中,它也出现了一些问题。那它出现问题的话呢,也可以实现异常穿透,你这儿不是不管吗,对不对,你这儿不管,那接着往后传,都用思路往后抛,抛抛抛,一直抛到最后看结果。看这error就是由最后的这个catch方法来帮你去实现啊,帮你去处理这个结果。这就是实现异常穿透的一个原理,就是给我们加了一个默认值。好,那么这块完了之后,咱们再往前迈一步。啊,除了可以进行异常穿透之外呢,这个promise还有另外一个特性,就是值传递。
08:02
也就是说,我第一个回调函数不传也行。啊,第一个回调函数不传也可以,像这样子,他也能够正常的向下去推进,大家可以看一下,点开右键刷新。好,当然这个位置26行,咱稍等一下啊,26行。Resolve。成功好别着急啊,这个显示的是咱们自个儿的,咱们先看内置的。好,点开它右键刷新。你看内置这个人家是可以呢,向前推进的,但是咱们这个不行。啊,咱这个不行,为什么咱这个不行啊,这个产生的原因跟刚才异常穿透那块是一样的,你成功了,但是呢,在指定回到这块,你两个都是onDeFi,我状态一改,我一去执行,在这儿我这一执行我傻眼了是吧,你这里边都是onDeFi呀,UNDEFINED1直行,那能出结果吗?出不来,所以说在这个位置指定回家的时候。
09:09
你如果第一个参数没传,我也可以为你去创建一个默认的。这样的函数。Unsold,你如果说不等于啊。那我就来给你创建一个默认值。然后来一个value这个函数啊,大家注意,这是一种简写,这个写法呢,就等同于value。然后呢,Return value这个写法是一样的。啊,写法是就是不是写法是最终效果是一样的啊,只是写法呢这种更加简单一点,这是ES6呢省略花块的一种写法。啊,这个直接就作为返回值了,好,那这个时候就是你没有指定参数,我给你加一个这样的回调函数参数进去。见着的话,咱们来看看结果,咱这个成没成,右键刷新。
10:03
你看二和三就来了,这个效果就跟内置的promise它的效果是一模一样的了。好了,这个小节,关于catch方法以及异常穿透,我们就先到这儿。
我来说两句