ES6中的promise的使用
一、提出promsie的目的?
- 为解决回调地狱的问题(主要是异步嵌套的可读性可信任问题)
那什么是回调地狱?什么是回调函数?
- 回调地狱: 通俗来说就是将函数作为参数,层层嵌套。
- 回调函数:一个函数作为参数需要依赖另一个函数执行调用。
嵌套到底有什么问题?来看下面的代码,这就是一个函数嵌套,我们经常这样写,代码的缩进有种金字塔的视觉,容易成读代码的有点不方便之外就是看起来不那么美观,
再来看一个面试中常见的顺序执行问题,打印的结果是什么?(自己执行下试试)
再来看一个简洁的回调:
这部分代码主要完成了什么?
- 对于回调函数handePhoto声明并定义
- 函数downloadPhoto在下载完图片后,调用回调函数handePhoto进行处理
- 最后输出Download started!
如果异步的嵌套都是这样干净整洁,那“回调地狱”给程序猿带来的伤害马上就会减少很多。
二、如何解决回调地狱问题?
- 保持代码简短、用功能化的函数名命名函数
- 拆解function:将各步拆解为单个的function
- 处理每一个错误
- Promise以自顶向下的方式执行,可以使用try / catch处理更多类型的错误
- Generators生成器:让你“暂停”单个函数,而不会暂停整个程序的状态
- async/await:看似同步的异步操作,通过await将函数挂起,等待await后的函数返回,再执行下面的语句。
三、详细说明promise用法
promise函数(三个状态、两个参数、then链式调用)
- 允许你以一种同步的方式编写异步代码,构造一个Promise实例需要给Promise构造函数传入一个函数,该函数有两个形参,分别是resolve和reject;
- 该实例有三个状态:pending(等待状态)、fulfilled(返回满足条件的状态)、rejected(延时对象不满足条件)状态 。pending–>fulfilled状态执行resolve();pending–>rejected状态执行rejected();
- Promise上还有then方法,then 方法就是用来指定Promise 对象的状态改变时确定执行的操作,resolve 时执行then的第一个函数,reject时执行then的第二个函数;
promise函数基本语法
promise函数then的语法
- then()里有两个回调函数,第一个是成功后(resolve返回)的回调function(num) {}, 另一个是失败后(reject返回)的回调function(err) {},异常发生时可以放在第二个回调里面处理。
- 也可以在then后面加.catch,在这里面进行异常处理
promise的其他函数(.all、.race)
- Promise.all:可以将多个实例组装成一个新的实例,成功的时候返回一个成功数组,失败的时候则返回最先被reject失败状态的值
- Promise.race:可以理解为赛跑的意思,也就是说Promise.race([p1, p2, p3])里面的结果哪个获取的快,就返回哪个结果,不管结果本身是成功还是失败