一.异步编程与Promise的关系
想要学会promise就需要先了解什么是异步编程:
当使用异步编程时,在等待当前任务的响应返回之前,可以继续执行后续代码,即当前执行任务不会阻塞后续执行,而之前任务响应返回后可以通过状态、通知和回调来通知调用者。
promise则是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大
二.Promise的作用与用法
1.作用
Promise实际上是一个容器,它里面通常放的是将来要执行的异步代码,这些代码执行完成后会有两种结果:成功或失败。
因此Promise有三种状态:pending(初始状态)、fullfill(成功状态)、reject(失败状态)
- 当我们在Promise内部调用了成功时的回调方法resolve()时则把Promise的pending转换成fullfill
- 当我们在Promise内部调用了失败时的回调方法reject()时则把Promise的pending转换成reject。
- 一旦状态改变,就不会再变
注意:promise本身是同步代码,只是内部保存着未来才会结束的事件(通常是一个异步操作)
2.基本用法
- Promise对象是一个构造函数,用来生成promise实例
- Promise的构造函数接收一个函数为参数,并且传入两个参数:
- resolve函数内部定义成功时我们调用的函
- reject 函数: 内部定义失败时我们调用的函数
const promise = new Promise(function(resolve,reject){
//do something
if(/*异步操作成功*/){
resolve(value);
}else{
reject(error);
)
- Promise实例生产后,可以用then方法分别指定resolved状态和rejected状态的回调函数
- 第一个回调函数是Promise对象的状态变为fulfilled时调用,参数为resolve()执行成功的返回值
- 第二个回调函数是Promise对象的状态变为rejected时调用,参数为reject()错误的原因
注:then()的作用,是将Promise中的状态入注到then()中,如果是fulfilled就执行第一个回调函数,是rejected就执行第二个回调函数
promise.then(function(value){
//value
},function(error){
//error
});
- Promise.all()方法:实参是所有Promise实例的字面量组成的数据,执行完毕的结果是所有输出结果的所组成的数组
例如:
输出结果:
注:输出顺序与传入参数顺序有关
- Promise.race(iterable)方法:
- iterable为包含了多个promise对象的可迭代数据结构,如数组
- 该方法返回一个promise
- 一旦迭代器中的某个promise解决或拒绝,返回的promise就会解决或拒绝
三.Promise在实际环境下的应用
利用Promise封装Ajax的GET请求,从指定url上获取JSON数据
四.async/await的作用与用法
async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。
await 也是一个修饰符,只能放在async定义的函数内。该指令会暂停异步函数的执行,可以理解为“等待”。 await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行,如果修饰的不是Promise对象,则返回该值本身