专业的编程技术博客社区

网站首页 > 博客文章 正文

手写Promise第四章-catch和finally #前端学习

baijin 2024-10-27 19:20:56 博客文章 10 ℃ 0 评论

Promise.prototype.catch()。

在前面就完成了 promise a 加规范的 promise。很多朋友让我写一下 catch 和 finally,也写一下。这两个东西不属于 promise a 加规范,它是 ES6 的 promise 新增的。既然写它们,后面我也会把这些竞拍方法也写了,any 这些都会写一下。

1. 先来看一下 MDN 文档上面的,由于它不属于 promess a 加规范,所以 promess a 加规范里面并没有描述它们相关的东西,就到 MDN 上面来看一下。

2. catch 用于注册一个 promise 被拒绝的时候调用的函数,并且它会返回一个等效的 promise 对象,就是可以去练试调用。这个方法是这个的一种简写,就是认的第二个参数。第一个参数就可以忽略掉了,因为需要监听拒绝的时候,注册一个在拒绝的时候调用的函数,所以只需要传第二个就可以了。

3. 对着文档就来实现一下,其实也蛮简单的,来实现一下。加一个 catch,catch 接收一个 unrejected 的,接收一个回调,回调就直接传给第二个函数就可以,就是传给认的第二个参数就可以了。

4. 然后返回一个新的 promise,promise 是一个成功的,就是 catch 返回的 promise 就已经成功了,和认是一样的,认第二个参数调用的时候也是成功的。

5. 来试一下,改成自己的 promise,p 点 catch,error,log,来试一下,刨出来一个 error,就是这边打印出来的。

其实调用这个 case 之后后面就是成功的了,就是 result,需要在这边返回,要是有返回值就会传递下来,比如返回一个 2,来试一下,这样就可以了。

然后来试一下,它跟官方的 promise 是不是一样的,返回一个 error 就可以了,打印一个 error,打印个 2,是一样的,这样 catch 就完成了。

完成 catch 之后再看一下下一个,就是 finally,finally 是什么时候执行的?不管执行了认还是执行了 cash,最终都会调用 finally,实际上是这样的,这边也说了,finally 这个方法类似于调用了这个,就是调用这个认,第一个参数传的也是这个函数,第二个参数传的也是这个函数,因为无论是在成功或者失败的时候都要执行,所以这个函数直接就传给它们两个就可以。

但是它还有几个不同的地方,什么不同的地方?就是在创建这个函数的时候可以只将其传入一次,而不是强制声明两次或者创建一遍。什么意思?就是平时这样点赞的时候是不是直接在这里就写函数了,但是要是写一样的函数,得在这里声明两个函数或者创建一个变量,就像这样把这两个函数传过去。

第二个不同的地方就是这个函数不接受任何参数,就是它是个没有参数的,所以也不关心这个东西是成功的还是拒绝的,所以不需要去提供。

第三个就是 finally,这个方法是透明的,不会改变原始的 promise 状态,就是原来的 promise 是什么状态?返回的新的 promise 还是什么状态?是这样的。

6. 按照这几点来写一下,在这里加 finally,返回个什么东西?实际上还是返回 promise,成功的时候也执行函数,失败的时候也执行函数。但是这样写还是有点问题,什么问题?首先 onFinally 不接受任何的参数,所以要这样写,就是不能接受参数。虽然这个点认是有参数的,但是不接受,所以就写成这个样子。

7. 但是返回的新的 promise 的状态要和这边是一样的,所以在认里面要返回上一次的状态,这边也是一样的,也不接受参数,但是这里是有的,所以在这边要调用。由于需要保持状态,可能会这样写,但是这样写这边是失败的,失败的调用了之后就变成成功的了。

8. catch 调用了之后,如果里面没有抛出错误,返回的 promise 就是成功,所以在这边要抛出错误,select 一个 error,这样就可以了。来试一下,在这里去调 finally,完成了。

9. 现在是官方的 promise,先来试一下,肯定会执行的,虽然完成了,但是这个是报错的,这个是错误的,所以这边也报了一个错误,再补货一下就没关系了。返回的 promise 和这边是保持一致的,所以还可以调一个 catch,这样就没有错误了,catch 里面也打印出来了。

10. 试一下自己的 promise,跟上面是一样的,保持一致的。现在也可以这样,可以试一下 Rezo,现在 reject 是没有问题的,试一下 Rezo,Rezo 一个成功。

11. 这里也可以调用 catch,当然还可以接着去调用 deren,所以 catch 就删掉了,直接调点认,试一下,这样完成了,也成功了。

12. 在这里试一下跟官方的是不是一致的,行为上也是一致的,做了一个状态的穿透,这样 finally 和 catch 就已经完成啦。

后面就来写 promise 一些静态方法。

本节视频就到这里,下期见,bye-bye。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表