记录高级js学习(十七)Promise的基本使用

129 阅读2分钟

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
      })