ES6新特性之Promise篇

来源:互联网 发布:php判断水仙花数 编辑:程序博客网 时间:2024/06/05 00:52

前几天换工作面试,总会碰到问ES6的新特性问题,而新特性中的Promise更是几乎90%都会问到。

一直知道ES6中有这个新特性主要是解决JS异步执行时候回调函数嵌套回调函数的问题(callback hell), 更简洁地控制函数执行流程;之前没有深入研究过这个问题,面试也就嘴炮了;

最近看了读了几篇同仁们关于promise的学习见解,看不如做,于是自己也想扒拉扒拉,巩固一下技能,学习学习;

首先我们来看如下这个函数:

这里写图片描述

这个函数看起来有点混乱,不利用后期代码的维护,我们用ES6的promise来将这个函数重写如下:

这里写图片描述

利用Promise改造后的函数明显容易理解和阅读.
接下来,去认识一下这个Promise:
1.基本使用:
其实通过上面的例子我们已经看到通过new实例化Promise, 构造函数需要两个参数, 第一个参数为函数执行成功以后执行的函数resolve, 第二个函数为函数执行失败以后执行的函数reject;与之对应的then方法接收两个参数, 第一个为函数的成功回调, 第二个为函数的失败回调:

这里写图片描述

resolve(X) X:是要传递给下一个then中回调函数的参数的值,如果X为空,那么就无需给下一个then传值,如下程序:

这里写图片描述

上图中的resolve(X)中的参数X就是then方法回调函数function(data)中的data;通过每一次回调return一个Promise实例,实现异步层层回调。如果是同步的就不用return Promise实例,直接then;

每一个实例化的Promise都有三个状态;pending(等待) rejected(拒绝) resolved(解决) ,默认的状态为pending,如果执行了resolve(), 那么这个promise的状态会变为resolved,如果执行了reject(), 那么这个promise的状态就会变成rejected, 而且这些状态是不可撤销的,一经更改,不会再变了;
通过以上的实践其实我们已经基本掌握Promise的then方法。

接下来,我们再接着看看catch方法:
catch方法实际就是如果异步函数抛出了错误了, 错误会被捕获, 并执行catch方法,如下:

这里写图片描述

Promise中的错误会被层层传递给下一个Promise对象,直到被捕捉为止:

这里写图片描述

这里写图片描述

构造函数Promise有四个方法, Promise.all, Promise.race, Promise.reject, Promise.resolve:

Promise.all:

这里写图片描述

可以发现Promise构造函数的all方法的参数是一个由元素是实例组成的数组,当全部resolve后调用then方法输出对应的结果数组。

Promise.race, Promise.reject, Promise.resolve这三个方法后续再继续研究研究。

既然promise是解决异步js问题的,那么就来实践实践,用promise来封装个GET请求;

这里写图片描述

运行结果(利用Node.js搭建的服务器,请求json数据,不存在跨域):

这里写图片描述

目前就搞到这,后续再继续研究研究。
具体可参考:Promise/A+ 规范

原创粉丝点击