promise是JS为了解决回调嵌套过于复杂,不利于编程而提出的解决办法
new Promise((res,rej)=>{
res("success")
}).then(value=>console.log(value),err=>console.log(err))
promise的单一状态和状态中转
promise有三个状态:pending,resolve,reject。而当promise中的状态改变之后,就不会发生改变了。
let promise = new Promise((res,rej)=>{
res()//成功函数执行,promise的状态发生改变
})
promise的状态中,通过then实现转态中转。promise.then是对上一个返回的promise的处理
let p1 = new Promise((res,rej)=>{
res("success")
})
new Promise((res,rej)=>{
res(p1)
}).then(value=>console.log(value))//输出success then是对上一个返回的promise的处理
.then().then()//如果then中没有处理函数,状态会往下传递
其他Promise的封装
如果返回的对象或者类里面有then方法的话,会等同于返回的promise
let p1 = {
then(res,rej){
res("success")
}
}
new Promise((res,rej)=>{
res(p1)
}).then(value=>console.log(value))//对象中有then方法,会被视为Promise,then会调用并处理
class P{
then(res,rej){
res("success")
}
}
let p1 = new P()
new Promise((res,rej)=>{
res(p1)
}).then(value=>console.log(value))//类实例中有then方法,会被视为Promise,then会调用并处理
class P{
static then(res,rej){
res("success")
}
}
new Promise((res,rej)=>{
res(P)
}).then(value=>console.log(value))//类静态方法中有then方法,会被视为Promise,then会调用并处理
Promise的错误监测
promise会监测错误,当有错误抛出,会直接被then中的错误函数捕获。
let p = new Promise((res,rej)=>{
//throw new Error("fail")
hd+1
})
p.then(value=>console.log(value),err=>console.log(err))
promise中也有catch函数来统一处理错误。
let p = new Promise((res,rej)=>{
hd + 1
})
p.then(value=>console.log(value)).catch(err=>{
console.log(err)
})
Promise中的finally
finally是无论promise成功与否都会执行的。等上面的then全部完成之后执行。
let p = new Promise((res,rej)=>{
res("hello")
})
p.then(value=>console.log(value)).finally(value=>console.log("finally"))
//输出hello、finally
Promise.resolve()
Promsie.reject()
Promise.all([])
Promise.allSettled([])
Promise.race([])
只会返回最先执行完的promise