promise是JS为了解决回调嵌套过于复杂,不利于编程而提出的解决办法

  1. new Promise((res,rej)=>{
  2. res("success")
  3. }).then(value=>console.log(value),err=>console.log(err))

promise的单一状态和状态中转

promise有三个状态:pending,resolve,reject。而当promise中的状态改变之后,就不会发生改变了。

  1. let promise = new Promise((res,rej)=>{
  2. res()//成功函数执行,promise的状态发生改变
  3. })
  1. promise的状态中,通过then实现转态中转。promise.then是对上一个返回的promise的处理
  1. let p1 = new Promise((res,rej)=>{
  2. res("success")
  3. })
  4. new Promise((res,rej)=>{
  5. res(p1)
  6. }).then(value=>console.log(value))//输出success then是对上一个返回的promise的处理
  7. .then().then()//如果then中没有处理函数,状态会往下传递

其他Promise的封装

如果返回的对象或者类里面有then方法的话,会等同于返回的promise

  1. let p1 = {
  2. then(res,rej){
  3. res("success")
  4. }
  5. }
  6. new Promise((res,rej)=>{
  7. res(p1)
  8. }).then(value=>console.log(value))//对象中有then方法,会被视为Promise,then会调用并处理
  1. class P{
  2. then(res,rej){
  3. res("success")
  4. }
  5. }
  6. let p1 = new P()
  7. new Promise((res,rej)=>{
  8. res(p1)
  9. }).then(value=>console.log(value))//类实例中有then方法,会被视为Promise,then会调用并处理
  1. class P{
  2. static then(res,rej){
  3. res("success")
  4. }
  5. }
  6. new Promise((res,rej)=>{
  7. res(P)
  8. }).then(value=>console.log(value))//类静态方法中有then方法,会被视为Promise,then会调用并处理

Promise的错误监测

promise会监测错误,当有错误抛出,会直接被then中的错误函数捕获。

  1. let p = new Promise((res,rej)=>{
  2. //throw new Error("fail")
  3. hd+1
  4. })
  5. p.then(value=>console.log(value),err=>console.log(err))
  1. promise中也有catch函数来统一处理错误。
  1. let p = new Promise((res,rej)=>{
  2. hd + 1
  3. })
  4. p.then(value=>console.log(value)).catch(err=>{
  5. console.log(err)
  6. })

Promise中的finally

finally是无论promise成功与否都会执行的。等上面的then全部完成之后执行。

  1. let p = new Promise((res,rej)=>{
  2. res("hello")
  3. })
  4. p.then(value=>console.log(value)).finally(value=>console.log("finally"))
  5. //输出hello、finally

Promise.resolve()

默认状态就是成功的promise

Promsie.reject()

默认状态是失败的promise

Promise.all([])

[]中的promise必须都是解决状态才会执行。

Promise.allSettled([])

不管promise的状态是什么都会执行

Promise.race([])

只会返回最先执行完的promise