Catalog
  1. 1. Promise的其他api
    1. 1.1. 原型成员(实例成员)
    2. 1.2. 构造函数成员(静态成员)
    3. 1.3. 处理异步之间的联系
ES6 之 Promise的其他api

Promise的其他api

原型成员(实例成员)

  • then:注册一个后续处理函数,当Promise为resolved状态时运行该函数
  • catch:注册一个后续处理函数,当Promise为rejected状态时运行该函数
  • finally:[ES2018]注册一个后续处理函数(无参),当Promise为已决时运行该函数(无论是resoleved或者rejected)
    1
    2
    3
    4
    5
    6
    7
    const pro = new Promise((res,rej) => {
    res(1)
    })
    pro.finally(() => {console.log('finally1')})
    pro.finally(() => {console.log('finally2')})
    pro.then((res) => {console.log('then',res)})
    // finally1 finally2 then,1

构造函数成员(静态成员)

  • resolve(数据):该方法返回一个resolved状态的Promise,传递的数据作为状态数据

    • 特殊情况:如果传递的数据是Promise,则直接返回传递的Promise对象
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      const pro = new Promise((res,rej) => {
      res(1)
      })
      pro.then(res => {
      console.log('then',res)
      })
      //如果promise里面只有res没有其他操作可以等效于下面的写法
      const pro1 = Promise.resolve(2)
      pro1.then(res => {
      console.log('then1',res)
      })
      1
      2
      3
      4
      5
      6
      7
      //特殊情况
      const pro = new Promise((res,rej) => {
      res(1)
      })
      const p = Promise.resolve(1)

      console.log(pro === p) //true
  • reject(数据):该方法返回一个rejected状态的Promise,传递的数据作为状态数据

    1
    2
    3
    4
    5
    //同上
    const pro1 = Promise.reject(3)
    pro1.catch(err => {
    console.log('catch',err)
    })
  • all(iterable):这个方法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable里面的promise对象失败则立即触发该promise对象的失败。这个新的promise对象在触发成功状态以后,会把一个包含iterable里所有promise返回值的数组作为成功回调的返回值,顺序跟iterable的顺序保持一致;如果这个新的promise对象触发了失败状态,它会把iterable里第一个触发失败的promise对象的错误信息作为它的失败错误信息。Promise.all方法常被用于处理多个promise对象的状态集合。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    const proms = []
    for (let i = 0; i < 10; i++) {
    const pro = new Promise((res,rej) => {
    setTimeout(() => {
    if(Math.random() < 0.1) {
    console.log(i,'success')
    res(i)
    }else {
    console.log(i,'fail')
    rej(i)
    }
    }, Math.floor(Math.random(3000 - 1000) + 1000));
    })
    proms.push(pro)
    }
    const pros = Promise.all(proms)
    pros.then(res => {
    console.log(res,'都成功了') //全部成功才会返回都成功,res为每一个pro的返回值组成的数组。
    })
    pros.catch(err => {
    console.log(err,'有失败的') //有一个失败即返回有失败的,err为第一个失败的返回值
    })
  • race(iterable):当iterable参数里的任意一个子promise被成功或失败后,父promise马上也会用子promise的成功返回值或失败详情作为参数调用父promise绑定的相应句柄,并返回该promise对象
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    const proms = []
    for (let i = 0; i < 10; i++) {
    const pro = new Promise((res,rej) => {
    setTimeout(() => {
    if(Math.random() < 0.1) {
    console.log(i,'success')
    res(i)
    }else {
    console.log(i,'fail')
    rej(i)
    }
    }, Math.floor(Math.random(3000 - 1000) + 1000));
    })
    proms.push(pro)
    }
    const pros = Promise.race(proms)
    pros.then(res => {
    console.log(res,'有一个成功了') //有一个成功就会返回成功
    })
    pros.catch(err => {
    console.log(err,'有一个失败了') //有一个失败即返回失败
    })

处理异步之间的联系

  • 有一个需求需要其他异步全部处理完之后做的
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    function biaobai(god) {   //异步发送短信
    return new Promise((res, rej) => {
    setTimeout(() => {
    console.log(`向女神${god}发送短信`)
    if (Math.random() < 0.3) {
    console.log(`${god}同意`)
    res(true)
    }
    else {
    console.log(`${god}拒绝`)
    res(false)
    }
    }, Math.floor(Math.random(3000 - 1000) + 1000));
    })
    }

    let hasAgree = false //全局变量记录第一个同意的女神
    const proms = []
    for (let i = 0; i < 10; i++) {
    const pro = biaobai(`女神${i}`).then(res => {
    if (res) {
    if (hasAgree) {
    console.log('发错了短信') //已经有同意的女神
    } else {
    hasAgree = true
    console.log(`太开心了`) //第一个同意的女神
    }
    }
    return res //返回resolved状态的promise
    })
    proms.push(pro) //把所有的promise装入一个数组
    }

    const pros = Promise.all(proms)

    pros.then(res => { //所有的promise都到了resolve状态后打印日志
    console.log('日志', res)
    })