1.promise存在的意义
首先我们要知道,js代码执行的过程中,分为同步和异步执行。
同步执行的代码是从上往下、从左往右进行执行的。只有上一句执行完了,才会继续执行上一句代码,异步执行的代码则可以与其他代码同步执行,互不影响,不严格按照顺序执行,而异步执行最明显的问题就是我们不知道异步代码什么时候结束。如果我们多个异步执行代码之间存在依赖关系,就会造成嵌套,这对我们阅读代码是非常不利的,es6新增了promise类,就能很好的解决这种问题。
2.promise基本语法
一、promise初始化
通过 new Promise()构造promise的实例对象,参数是一个回调函数,而回调函数也有两个参数,分别为resolve、reject,这两个参数也是两个函数。
二、promise的三种状态
promise有三种状态,分别为:
1 pending 待定状态,创建一个实例对象之后 初始化时候promise就是一个待定状态
2 fulfilled 成功状态,当我们调用resolve之后就属于成功状态,触发then回调函数
3 rejected 失败状态 ,当我们调用reject之后就属于失败态,触发catch 回调函数
一个promise的状态,只能从待定状态转为成功或者失败状态(当触发reslove函数时转为成功状态,当触发reject函数时转为失败状态),不能逆向转换,成功和失败状态也是不可相互转换的。且一旦发生改变就能再变,也就是说promise的对象的状态不受外界影响,一旦从pending转为fulfilled或rejected,promise的状态就会凝固,再任何时候都可以获取到结果。
三、promise的then和all方法
1.then()
then()方法在reslove函数触发后进行使用,返回值是,第一个异步函数执行完的结果,可以一直.then()下去链式调用。
2.catch()
catch()方法在reject()函数触发后进行调用,返回值是抛出的错误原因。
3.all()
all()方法的参数是一个数组,数组的每一个元素都是promise的实例对象,当每一个promise对象都是成功状态的时候,才会触发 all()的then()函数,只要有一个不成功就触发all()的catch()函数
例如:
var p = Promise.all([p1,p2,p3,p4])
p.then(res=>{
console.log(res,"+++++++++++") //res 就是每一个promise对象resolve的数据 是一个数组结构
}).catch(res=>{
console.log(res,"-----------")
})
rach()
rach() 比较多个promise对象,看看谁先进入状态,也就是谁先调用了resovle/reject函数,如果reject先触发,race之后的promise调用catch函数,如果是resolve先触发了,race之后的promise调用then回调函数
rach()的参数是是一个数组,例如:
Promise.race([cook(),drink()]).then(res=>{ }).catch(res=>{ })
Promise的其他API
Promise.reject("设置promise为失败状态").catch(err=>console.log(err))
Promise.resolve("设置promise为失败状态").then(res=>console.log(res))