Promise三种状态:penging(等待状态),fulfilled(已敲定/兑现状态),rejected(已拒绝状态)
resolve传不同参数的表现
//普通参数
new Promise((resolve,reject)=>{
resolve("成功了") // 普通的值或对象 pengding => fulfilled
// reject("失败了") // pengding => rejected
}).then(
res => console.log(res)
).catch(
err => console.log(err)
)
// Promise参数 交由新的Promise执行速度会比直接执行慢,所以这个最后打印
const promise = new Promise((resolve,reject)=>{
resolve("交由新的promise执行")
})
new Promise((resolve,reject)=>{
resolve(promise) // 传一个Promise,当前状态交由该Promise来决定
})
// 带then属性的obj参数,简称thenable
new Promise((resolve,reject)=>{
const obj = {
then:function(resolve,reject){
resolve("thenable执行了")
}
}
resolve(obj) // 传一个obj且里面有then属性,会执行这个then属性 由该then方法决定后续状态
})
then对象方法的使用
// 同一个Promise实例触发resolve,则对应的then都会执行
function foo(){
return new Promise((resolve,reject)=>{
resolve("完成")
})
}
const p1 = foo()
p1.then(res=>{
console.log('res1: ', res)
})
p1.then(res=>{
console.log('res2: ', res)
})
p1.then(res=>{
console.log('res3: ', res)
})
// then中如果有return,则这个return的值会被包裹在一个Promise的resolve中,传给下一个then
new Promise((resolve, reject) => {
resolve("成功了")
}).then(res => {
// 后续的then是基于该Promise的,与前面的无关,不return会默认返回undefined
return 111
}).then(res=>{
console.log('res: ', res) // res:111
})
// 返回一个thenable对象 会执行该对象then属性的resolve,并返回给下一层的then
new Promise((resolve, reject) => {
resolve("成功了")
}).then(res => {
return {
then:function(resolve,reject){
resolve("执行")
}
}
}).then(res=>{
console.log('res: ', res)
})
catch对象方法的使用
//可以通过throw和reject抛出异常
new Promise((resolve,reject)=>{
throw new Error("异常了") //catch也会捕获该异常,且中断后面代码的执行
reject("异常") //reject不会中断代码,把上行注释,抛出异常后下面打印还是能执行
console.log("dadada");
})
// 也可以通过return一个promise调用reject方法抛出异常
new Promise((resolve,reject)=>{
resolve()
}).then(res=>{
return new Promise((resolve,reject)=>{
//状态变为rejected 后续then不会执行
//直至找到catch将状态转为fulfilled,没找到则报错 中断代码
reject("失败了")
})
})
finally对象方法的使用
无论如何都会执行
Promise基础类的用法
// Promise类方法 快速创建一个Promise
const p = Promise.resolve("成功") //传Promise则交由其处理,传thenable则交由其处理
const p1 = Promise.reject("失败") //不管传Promise还是thenable,都直接返回出去
Promise.all 所有Promise resolve完才走then,有一个reject就直接走catch
Promise.allSettled 所有Promise执行完走then 不会受reject影响,会返回所有resolve和reject的状态及返回值组成的数组
Promise.race 取最快返回的Promise 不管是resolve还是reject
Promise.any 取第一个then返回的值,不会受reject影响,全部为reject才会走catch
// 就举一个的使用例子,p1,p2,p3都是延时执行的resolve
Promise.all([p1,p2,p3,"1234"]).then(res=>{
console.log('res: ', res); // res,['1111', '2222', '3333', '1234']
}).catch(err=>{
console.log('err: ', err); //若是中间有一个reject则会直接走catch
})