ES6中对promise的理解及它的实例方法?
1) promise是一种异步编程的解决方案(本身并不是异步操作)
2) 多个串联的异步操作形成回调地狱--promise解决了回调地狱
3) 三种状态: pending(进行中), fulfilled(已成功), rejected(已失败)
4) 特点:状态不受外界影响,只有异步操作的结果,决定当前是哪一种状态,
一旦状态改变就不会再变(pending-->fulfilled, pending-->rejected)
5) 用法:promise是一个构造函数,用来生成Promise实例
6) Promise构造函数接收一个函数作为参数,这个函数有两个参数
const p = new Promise(function(resolve,reject){
resolve()//对象状态:从未完成变为成功,在异步操作成功的时候调用
reject()//对象状态:从未完成变为失败,在异步操作失败的时候调用
})
Promise实例中的三个方法 then, catch(),finally();
1) then(): //当实例状态发生改变的时候的回调函数
const p = new Promise(function(resolve,reject){
setTimeout(()=>{
const time = new Date().getTime();
if(time % 2 == 0){//偶数
resolve('成功的数据,time--'+time)
}else{
reject('失败的数据')
}
})
})
p.then((value)=>{//resolve 成功的状态
console.log(value)
},(reson)=>{ //失败的状态(catch也可以)
console.log(reson)
})
2) catch() 用于指定发生错误的回调函数
p.catch((value)=>{ //(then的第二个参数也可以)
console.log(value)
})
3) finally() 无论Promise成功或失败都需要执行的操作。
p.then((value)=>{
console.log(value)
}).catch((value)=>{
console.log(value)
})
.finally(()=>{
console.log('最后的结果')
})
## Promise.all理解及应用场景
1)
//用于将多个Promise实例,包装成一个新的Promise实例
//状态:all状态有p1,p2决定,三个状态成功,all返回成功,其中一个返回失败,all返回失败。
let p1 = new Promise((resolve,reject)=>{
resolve('成功1')
})
let p2 = new Promise((resolve,reject)=>{
//resolve('成功2')
reject('sb')
})
//如果定义了自己的catch方法,all是不能触发的
<!-- .catch((v)=>{
console.log('error')
}) -->
//参数可以不是数组,但必须是iterator接口.
let all = Promise.all([p1,p2]);
console.log(all) //
all.then((value)=>{
console.log(1)
}).catch((res)=>{
console.log(2)
})
2) 多个请求结果合并在一起
function fun1(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('函数1')
},1000)
})
}
function fun2(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('函数2')
},2000)
})
}
function fun3(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('函数3')
},3000)
})
}
function initFun(){
let allFun = Promise([fun1(),fun2(),fun3()])
console.log(allFun)
allFun.then((v)=>{
console.log(v)
})
}
initFun();
## Promise.race的用法以及使用场景
1 将多个Promise实例包装成一个新的Promise实例
race 和 all 大致用法相同。
race 和 all 区别?
all 返回都成功才成功,有一个不成功就返回失败。
race 只要实例中有一个改变状态,就会返回(无论是成功或失败)
function f1(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('函数111')
},1000)
})
}
function f2(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
reject('函数222')
},2000)
})
}
//调用
const pTrace = Promise.race([f1,f2]);
console.log(pTrace)