一步一步实现一个符合PromiseA+规范的Promise库(3)

平常先打个招呼。。javascript

clipboard.png

今天咱们就来完整的实现以前还留有一些小的方法没实现的Promise。。html

回顾:一步一步实现一个符合PromiseA+规范的Promise库(1)java

一步一步实现一个符合PromiseA+规范的Promise库(2)es6

咱们都知道,Promise中的经常使用方法有then、catch、Promise.resolve、Promise.reject、Promise.all、Promise.race这些经常使用方法,接下来咱们就一一来实现它们。数组

先来实现.catch方法。异步

咱们来看如下代码async

clipboard.png

咱们这里使用的是es6原生的Promise,看到在catch拿到了reject的结果。并且咱们看到,在then方法中只有onfulfilled一个回掉函数。函数

并且,catch方法是支持链式调用的,so。。咱们须要把这个方法挂载到咱们的Promise上。学习

clipboard.png

这样咱们就实现了Promise中的catch方法,是否是很简单。测试

能够从以前的测试中看到,.catch方法中的参数只有一个回掉函数,这个回掉函数中有一个参数。咱们不难看出来,无论怎样,这个catch方法拿到的老是咱们程序onrejected状态下的值。因此咱们return一个then方法并且只给这个then方法onrejected回调。then方法中onfulfilled状态咱们传了一个null,为何?其实咱们前面有讲到过,请参考我上一篇文章: 一步一步实现一个符合PromiseA+规范的Promise库(2)中的onfulfilled和onrejected默认值的问题。这里咱们就再也不赘述了。

咱们再来看看Promose.resolve和Promise.reject这两个方法。

clipboard.png

额。。其实这两个方法也就是分别返回一个成功和失败的Promise。这两个方法做为静态方法直接挂在到Promise上便可。

接下来咱们实现Promise.all方法。

咱们知道Promise.all这个方法是处理多个Promise组成的数组而且返回一个Promise,当所有的Promise处理完毕后在咱们下次调用then方法时将这个处理结果的数组返回。咱们看下下面的代码。

clipboard.png
Promise.all用法

因此咱们能够根据这个原理,来实现咱们的Promise.all方法。

咱们来看如下代码。

clipboard.png

额。。我以为已经蛮清楚了,再捋一捋。

拿到参数Promise数组->遍历执行(调用其then方法)->存放到返回数组中->判断执行是否完毕(完毕:返回咱们的数组)。

clipboard.png

今天有些晚了,就先实现这几个吧。race方法等明天或者有空吧。而后咱们再来分享下javascript的异步发展流程。。

最初的callback->Promise->generator函数->咱们如今经常使用的 async await

就酱:)

clipboard.png

更新

race方法的实现。

Promise.race这个方法颇有意思。。这个方法也是跟all方法同样接受一个Promise组成的数组,可是这些个Promise只要有一个成功了,咱们的race方法也就执行完毕了,而且返回Promise的执行结果。咱们先来看下用法。

clipboard.png

咱们看到这里race方法中有一个Promise数组,不过只返回了一个结果。而且这个race方法也返回了一个Promise,由于咱们在接下来的then方法中拿到了以前的执行结果。so。咱们来实现下。

clipboard.png

咱们能够看到,在循环中咱们直接调用了传进来的那些Promise,而后当成功时会直接调用咱们返回的Promise的resolve方法把执行的结果返回出去。

到这里咱们基本上就实现了一个比较完整的Promise,固然这个Promise还相对简单。不过咱们也蛮不错了。

clipboard.png

接下来咱们看一下js的异步发展流程.

咱们都知道之前好比说咱们在处理异步的时候一般会有这样的代码。

回调函数

若是{

我是说{

            能不能{

                        干一件事{

                         }

            }

    }
复制代码

}

丑的一批。。

。。其实也还好,主要是还蛮好看的。可是若是咱们异步作的多了,回调地狱天然不可避免。因此Promise应运而生。

咱们再来看下Promise

通常的代码是这样

Promise.resolve().then().then()......

then多了也不咋好看。。并且一个then中两个回调,再返回Promise。。EMMMMM。。

而后出现的就是咱们的generator函数。

generator

clipboard.png

若是用过generator函数的小伙伴们应该知道。generator能够在执行过程当中屡次返回,因此它看上去就像一个能够记住执行状态的函数,generator函数一般配合Promise和tj写的co库来使用。因为generator函数会产生一个执行器,咱们要使用这个执行器的next方法来执行咱们的异步方法去获得咱们想要的值。

若是有些小伙伴还不明白generator的工做方式,能够去看一下他的使用方法。->Generator 函数的含义与用法

co库能够帮助咱们不去管执行器中的next方法,返回一个Promise而且把执行结果放到返回的Promise的then方法中。

咱们能够本身实现一个co库,其实也是很简单的一个方法。

clipboard.png

咱们看一下测试结果

clipboard.png

发现依旧是没有问题的。这样咱们就写了一个简单的co库来帮助咱们使用generator函数。

最后一个就是咱们的async和await。

async-await

clipboard.png

咱们能够看到,async和await,使用起来跟generator函数相似,其实呢,async和await就是generator和yield的一种语法糖,

固然这个语法糖的实现比较复杂,咱们若是有时间的话还会跟你们一块儿实现一下。咱们这里先看看他的用法。

咱们能够看到,async方法同样的返回了一个Promise,而且至关于自动执行了generator中的next方法,使得咱们没必要再耗费精力去处理执行器,在开发中使咱们的开发体验变好了许多。。毕竟代码仍是简洁明了好一点。。。

clipboard.png

好了,一路走来咱们也算比较完整的了解了Promise的实现原理,咱们也算是完成了一个符合Promise/A+规范的Promise库。而后咱们还了解了js近些年来的异步发展,有没有以为本身很棒呢。。(反正我是以为咱们蛮厉害)

最后,但愿你们不论是生活仍是学习和工做中均可以更好。再次感谢你们能够看到这里,谢谢。

就酱,Bye~

clipboard.png
相关文章
相关标签/搜索