平常先打个招呼。。javascript
今天咱们就来完整的实现以前还留有一些小的方法没实现的Promise。。html
回顾:一步一步实现一个符合PromiseA+规范的Promise库(1)java
一步一步实现一个符合PromiseA+规范的Promise库(2)es6
咱们都知道,Promise中的经常使用方法有then、catch、Promise.resolve、Promise.reject、Promise.all、Promise.race这些经常使用方法,接下来咱们就一一来实现它们。数组
先来实现.catch方法。异步
咱们来看如下代码async
咱们这里使用的是es6原生的Promise,看到在catch拿到了reject的结果。并且咱们看到,在then方法中只有onfulfilled一个回掉函数。函数
并且,catch方法是支持链式调用的,so。。咱们须要把这个方法挂载到咱们的Promise上。学习
这样咱们就实现了Promise中的catch方法,是否是很简单。测试
能够从以前的测试中看到,.catch方法中的参数只有一个回掉函数,这个回掉函数中有一个参数。咱们不难看出来,无论怎样,这个catch方法拿到的老是咱们程序onrejected状态下的值。因此咱们return一个then方法并且只给这个then方法onrejected回调。then方法中onfulfilled状态咱们传了一个null,为何?其实咱们前面有讲到过,请参考我上一篇文章: 一步一步实现一个符合PromiseA+规范的Promise库(2)中的onfulfilled和onrejected默认值的问题。这里咱们就再也不赘述了。
咱们再来看看Promose.resolve和Promise.reject这两个方法。
额。。其实这两个方法也就是分别返回一个成功和失败的Promise。这两个方法做为静态方法直接挂在到Promise上便可。
接下来咱们实现Promise.all方法。
咱们知道Promise.all这个方法是处理多个Promise组成的数组而且返回一个Promise,当所有的Promise处理完毕后在咱们下次调用then方法时将这个处理结果的数组返回。咱们看下下面的代码。
因此咱们能够根据这个原理,来实现咱们的Promise.all方法。
咱们来看如下代码。
额。。我以为已经蛮清楚了,再捋一捋。
拿到参数Promise数组->遍历执行(调用其then方法)->存放到返回数组中->判断执行是否完毕(完毕:返回咱们的数组)。
今天有些晚了,就先实现这几个吧。race方法等明天或者有空吧。而后咱们再来分享下javascript的异步发展流程。。
最初的callback->Promise->generator函数->咱们如今经常使用的 async await
就酱:)
更新
race方法的实现。
Promise.race这个方法颇有意思。。这个方法也是跟all方法同样接受一个Promise组成的数组,可是这些个Promise只要有一个成功了,咱们的race方法也就执行完毕了,而且返回Promise的执行结果。咱们先来看下用法。
咱们看到这里race方法中有一个Promise数组,不过只返回了一个结果。而且这个race方法也返回了一个Promise,由于咱们在接下来的then方法中拿到了以前的执行结果。so。咱们来实现下。
咱们能够看到,在循环中咱们直接调用了传进来的那些Promise,而后当成功时会直接调用咱们返回的Promise的resolve方法把执行的结果返回出去。
到这里咱们基本上就实现了一个比较完整的Promise,固然这个Promise还相对简单。不过咱们也蛮不错了。
接下来咱们看一下js的异步发展流程.
咱们都知道之前好比说咱们在处理异步的时候一般会有这样的代码。
回调函数
若是{
我是说{
能不能{
干一件事{
}
}
}
复制代码
}
丑的一批。。
。。其实也还好,主要是还蛮好看的。可是若是咱们异步作的多了,回调地狱天然不可避免。因此Promise应运而生。
咱们再来看下Promise
通常的代码是这样
Promise.resolve().then().then()......
then多了也不咋好看。。并且一个then中两个回调,再返回Promise。。EMMMMM。。
而后出现的就是咱们的generator函数。
generator
若是用过generator函数的小伙伴们应该知道。generator能够在执行过程当中屡次返回,因此它看上去就像一个能够记住执行状态的函数,generator函数一般配合Promise和tj写的co库来使用。因为generator函数会产生一个执行器,咱们要使用这个执行器的next方法来执行咱们的异步方法去获得咱们想要的值。
若是有些小伙伴还不明白generator的工做方式,能够去看一下他的使用方法。->Generator 函数的含义与用法
co库能够帮助咱们不去管执行器中的next方法,返回一个Promise而且把执行结果放到返回的Promise的then方法中。
咱们能够本身实现一个co库,其实也是很简单的一个方法。
咱们看一下测试结果
发现依旧是没有问题的。这样咱们就写了一个简单的co库来帮助咱们使用generator函数。
最后一个就是咱们的async和await。
async-await
咱们能够看到,async和await,使用起来跟generator函数相似,其实呢,async和await就是generator和yield的一种语法糖,
固然这个语法糖的实现比较复杂,咱们若是有时间的话还会跟你们一块儿实现一下。咱们这里先看看他的用法。
咱们能够看到,async方法同样的返回了一个Promise,而且至关于自动执行了generator中的next方法,使得咱们没必要再耗费精力去处理执行器,在开发中使咱们的开发体验变好了许多。。毕竟代码仍是简洁明了好一点。。。
好了,一路走来咱们也算比较完整的了解了Promise的实现原理,咱们也算是完成了一个符合Promise/A+规范的Promise库。而后咱们还了解了js近些年来的异步发展,有没有以为本身很棒呢。。(反正我是以为咱们蛮厉害)
最后,但愿你们不论是生活仍是学习和工做中均可以更好。再次感谢你们能够看到这里,谢谢。
就酱,Bye~