Promise中resolve、reject、 all 、allSettled、race、any的实现过程

59 阅读1分钟

Promise 的方法功能不用多说,既然你看到了这篇文章,也就多多少少知道它的使用方式了。 直接上代码:

resolve

function promiseResolve(arg) {
   return new Promise(resolve => resolve(arg))
}

reject

function promiseResolve(arg) {
   return new Promise((resolve, reject) => reject(arg))
}

all

function promiseAll(promiseArr) {
  const values = []
  return new Promise((resolve, reject) => {
    const length = promiseArr.length
    let count = 0
    for (let i = 0; i < length; i++) {
      // 如果不是promise ,转换成promise
      let promise = promiseArr[i]
      if (!(promise instanceof Promise)) {
        promise = Promise.resolve(promise)
      }
      promise.then(res => {
        count ++
        values[i] = res
        if (count >= length) {
          resolve(values)
        }
      }, err => {
        reject(err)
      })
    }
  })
}

allSettled

function promiseAllSettled(promiseArr) {
  const values = []
  return new Promise((resolve, reject) => {
    const length = promiseArr.length
    let count = 0
    for (let i = 0; i < length; i++) {
      // 如果不是promise ,转换成promise
      let promise = promiseArr[i]
      if (!(promise instanceof Promise)) {
        promise = Promise.resolve(promise)
      }
      promise.then(res => {
        count++
        values[i] = { status: 'fulfilled', value: res }
        if (count >= length) {
          resolve(values)
        }
      }).catch(err => {
        count++
        values[i] = { status: 'rejected', reason: err }
        if (count >= length) {
          resolve(values)
        }
      })
    }
  })
}

race

function promiseRace(promiseArr) {
  return new Promise((resolve, reject) => {
    const length = promiseArr.length
    let count = 0
    for (let i = 0; i < length; i++) {
      // 如果不是promise ,转换成promise
      let promise = promiseArr[i]
      if (!(promise instanceof Promise)) {
        promise = Promise.resolve(promise)
      }
      promise.then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    }
  })
}

any

function promiseAny(promiseArr) {
  const errValues = []
  return new Promise((resolve, reject) => {
    const length = promiseArr.length
    let count = 0
    for (let i = 0; i < length; i++) {
      // 如果不是promise ,转换成promise
      let promise = promiseArr[i]
      if (!(promise instanceof Promise)) {
        promise = Promise.resolve(promise)
      }
      promise.then(res => {
        // 只要有一个成功,直接返回
        resolve(res)
      }, err => {
        // 如果都失败了
        errValues.push(err)
        if (errValues.length === length) {
          reject('AggregateError: All promises were rejected')
        }
      })
    }
  })
}

测试代码:

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(111)
  }, 2000)
})
const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(222)
  }, 1000)
})
const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(333)
  }, 3000)
})

// 最后一个成员是非promise,这种也需要考虑
promiseAll([p1, p2, p3, 44444]).then(res => {
  console.log('success: ', res)
}).catch(err => {
  console.log('err: ', err)
})

希望对 viewers 有所帮助,期待您的留言。