promise笔记

174 阅读2分钟

promise的状态的判断:

  • 如果then()方法中返回一个参数值,则状态为fulfilled
  • 如果then()方法中抛出一个异常,则状态为rejected
  • 如果then()方法中调用resolve(),则状态为fulfilled
  • 如果then()方法中调用reject(),则状态为rejected
  • 如果then()方法中返回一个padding状态的promise,则状态为padding
  • 如果then()方法没有明确的指定时(resolve()/reject()/return data...),那么状态为padding

then方法

调用后返回一个promise对象,这意味着实例化后的promise对象可以进行链式调用,接受两个参数,处理成功结果的函数以及处理失败的函数

<script>
    //success
    const prm = new Promise((resole, reject) => {
      resole(123)
    })
    //padding
    const prm1 = prm.then(res => {
      console.log(res);
      return new Promise((res, rej) => { })
    }, err => {
      console.log(err);
    })
    //padding
    const prm2 = prm1.then(res => {
      console.log(res);
    }, err => {
      console.log(err, 'err');
    })
  </script>

catch方法

与then方法类似,都会返回一个promise对象,主要用于捕获异步操作时出现的异常,因此我们常常省略then方法的第二个参数,将错误处理控制权转交给其后面的catch()函数

<script>
    const prm = new Promise((res,rej)=>{
      rej('error')
    }).then(res=>{
      //不会被执行
      console.log('success');
    }).catch(err=>{
      console.log(err);//error
    })
  </script>

Promise.all方法

此方法接受一个参数,这个参数必须是一个可迭代对象,它通常用来处理一些并发的异步操作,即它们的结果互不干扰,又需要异步操作,它最终只有两个状态:成功或者失败

它的状态受参数内各个值的影响,即里边的状态全部为fulfilled时,状态才为fulfilled,否则为rejected

成功调用后返回一个数组,数组的值是有序的,即按照传入参数的数组的值操作后返回的结果

失败调用后返回失败状态的信息以及值

<script>
    const prm1 = new Promise((res,rej)=>{
      res(123)
      // rej(123);  报错信息...123
    })
    const prm2 = 42;
    const prm3 = new Promise((res,rej)=>{
      res(456)
    })
    Promise.all([prm1,prm2,prm3]).then(value=>{
      console.log(value);//[123,42,456]
    })
  </script>

Promise.race方法

与Promise.all类似,都接收一个可迭代对象,但是Promise.race的状态不是全部受参数内的状态影响,一旦参数内有一个值的状态发生改变,那么该Promise的状态就会发生改变

<script>
    const prm1 = new Promise((res,rej)=>{
      setTimeout(()=>{
        res(123)
      },1000)
    })
    const prm2 = 42;
    const prm3 = new Promise((res,rej)=>{
      res(456)
    })
    Promise.race([prm1,prm2,prm3]).then(value=>{
      console.log(value);//42
    })
  </script>

Promise.resolve

接收一个参数值,可以是普通的值,具有then()方法的对象以及Promise实例,正常情况下,返回一个Promise对象,状态为fulfilled,若解析错误则返回的Promise对象的状态为rejected

<script>
    const p1 = Promise.resolve(5).then(data=>{
      console.log(data);//5
    })

    const obj = {
      then(){
        console.log('具有then方法的对象');
      }
    }
    const p2 = Promise.resolve(obj).then(res=>{});//相当于调用obj.then,只不过返回值是一个Promise对象

    const p3 = Promise.resolve(3);
    const p4 = Promise.resolve(p3).then(res=>{
      console.log(res);//3
    })

    const p5 = Promise.reject(5);
    const p6 = Promise.resolve(p5)
    p6.then(res=>{
      console.log('success',res);
    }).catch(err=>{
      console.log('error',err);//error 5
    })
  </script>

Promise.reject

与Promise.resolve正好相反,它接收一个参数值,即发生异常的原因,此时返回的Promise对象的状态就是rejected

const p1 = Promise.reject('手动拒绝');
    p1.then(res=>{
      console.log('不执行');
    }).catch(err=>{
      console.log(err);//手动拒绝
    })

----------------完毕-----------------------

总之,除非then方法抛出异常或者是明确置为rejected,否则它返回的Promise对象一直都是fulfilled,并且它的状态不受上一级的影响