Promise.all(iterable) 和 Promise.race(iterable)方法的实现(三)

目录

 

Promise.all(iterable)方法

Promise.race(iterable)方法


Promise.all(iterable)方法

  • 接收的参数为promise数组,返回一个新的Promise实例,当iterable参数内的所有的promise都fulfilled或者参数中不包含Promise时,状态变成fulfilled。如果参数中有一个失败的,此回调失败,返回第一个失败的promise返回的结果
      const p1 = Promise.resolve(2)
      const p2 = Promise.resolve(Promise.resolve(3))
      const p3 = Promise.resolve(Promise.reject(4))
      const p4 = new Promise((resolve) => {
        setTimeout(() => {
          resolve(5)
        }, 1000)
      })

      const pAll = Promise.all([p4, 7, p1, p2])
      pAll.then(
        (values) => {
          console.log('all value', values)
        },
        (reason) => {
          console.log('all reason', reason)
        }
      )
//输出 [5,7,2,3]

实现promise.all(iterable)方法

  Promise.all = function (promises) {
    let values = new Array(promises.length) //用来保存所有成功value的数组
    //用来保存成功promise的数量
    let resolvedCount = 0
    return new Promise((resolve, reject) => {
      // 遍历获取每个promise的结果
      promises.forEach((p, index) => {
        Promise.resolve(p).then(
          (value) => {
            // 成功数量+1
            resolvedCount++
            //p成功,将成功的value保存到value中
            values[index] = value
            // 如果全部成功了,将return的promise改为成功
            if (resolvedCount === promises.length) {
              resolve(values)
            }
          },
          (reason) => {
            reject(reason)
          }
        )
      })
    })
  }

Promise.race(iterable)方法

  • Promise.race(iterable)返回一个promise,一旦迭代器中的某个promise成功或失败,就返回一个成功或失败的promise

示例:

      const p1 = Promise.resolve(2)
      const p2 = Promise.resolve(Promise.resolve(3))
      const p3 = Promise.resolve(Promise.reject(4))

      const p4 = new Promise((resolve) => {
        setTimeout(() => {
          resolve(5)
        }, 1000)
      })
      const p5 = Promise.reject(6)

      const pRace = Promise.race([p4, p5, p3, p1, p2])
      pRace.then(
        (value) => {
          console.log('race value', value)
        },
        (reason) => {
          console.log('race reason', reason)
        }
      )
//输出 6 因为p5 先返回一个失败的promise

实现:

  /*
  Promise的函数对象的race方法
  返回一个promise,其结果由第一个完成的promise决定
  */
  Promise.race = function (promises) {
    // 返回一个promise
    return new Promise((resolve, reject) => {
      promises.forEach((p, index) => {
        Promise.resolve(p).then(
          (value) => {
            //一旦有成功,将return 变为成功
            resolve(value)
          },
          (reason) => {
            //一旦有失败,将return变为失败
            reject(reason)
          }
        )
      })
    })
  }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值