最近复习es6,以此做笔记
为解决ajax多次请求,并且依赖上一次结果的多次请求造成的代码可读性差,消耗更多的等待时间,以及不容易维护的问题,而新增了特性promise,promise能更合理规范的进行异步处理操作。
(一)基本用法:
let pro = new Promise(function(resolve,reject){
//pending状态
if(true){
//fulfilled状态
resolve("操作成功")
}else{
//rejected状态
reject("操作失败")
}
})
pro.then(function(res){
//用于绑定操作成功后的处理程序
})
pro.catch(function(err){
//用于绑定处理失败和操作异常后的处理程序
})
promise对象是全局对象,也可以理解为一个类,创建promise的时候需要new实例,参数是一个匿名函数,匿名函数的两个参数resolve和reject,resolve是处理异步操作成功后的业务,reject是处理异步操作失败后的业务。
promise对象有三个状态:
1.pending : 刚刚创建实例的时候,表示初始状态,
2.fulfilled : resolve方法调用的时候,表示操作成功状态,
3.rejected : reject方法调用的时候,表示操作失败状态,
状态只能是从初始化 > 成功,初始化 > 失败,不能逆向进行,也不能失败和成功之间转换。
(二)举例:
let pro = new promise(function(resolve,reject){
//pending状态
if(true){
resolve("处理操作成功事件")
}else{
reject("处理操作失败事件")
}
})
pro.then(requesta)
.then(requestb)
.then(requestc)
.catch(requestd)
function requesta(){
console.log('请求a完成')
return '可以调用请求b了,'
}
function requestb(res){
console.log(res + '请求b完成')
return '可以调用请求c了,'
}
function requestc(res){
console.log(res + '请求c完成')
}
function requestd(err){
console.log('请求失败')
}
//打印结果......
//请求a完成
//可以调用请求b了,请求b完成
//可以调用请求c了,请求c完成
使用了then方法按顺序调用,很直观的就能看清楚调用的顺序,层层依赖,方法调用成功后把下一个方法需要的参数一并return过去,供下一步操作使用
(三)promise.all()方法:
promise.all()方法接受数组为参数,数组的元素需要为promise实例,当实例中的状态都为fulfilled时候,promise.all()才会有返回
实例:
let pro1 = new promise( resolve=>{
setTimeout(function(){
resolve('实例1操作成功')
},1000)
})
let pro2 = new promise( resolve =>{
setTimeout(function(){
resolve('实例2操作成功')
},3000)
})
promise.all([pro1,pro2]).then(result =>{
console.log(result)
})
//打印结果
//['实例1操作成功','实例2操作成功']
promise.race()方法和promise.all()基本相同,不同之处在于数组中的任何一个promise实例进入fulfilled状态或者rejected就会有返回,不管事成功还是失败都会返回,并且其他实例再有状态变换那也不管了。
实例:
let pro1 = new promise( resolve=>{
setTimeout(function(){
resolve('实例1操作成功')
},1000)
})
let pro2 = new promise( resolve =>{
setTimeout(function(){
resolve('实例2操作成功')
},3000)
})
promise.race([pro1,pro2]).then(result =>{
console.log(result)
}).catch(err =>{
console.log(err)
})
//打印结果
//实例1操作成功
promise.all()和promise.race()方法在一些逻辑需求中可以说是恰到中用