手写一个Promise.all()方法

88 阅读1分钟

最近在准备面试,所以在看一些面试题来梳理自己的知识结构。在实现这个Promise相关方法的时候发现网上大家实现的方法有很多种,由于也没有个标准,所以想把自己实现的代码也贴出来,希望能海纳百川,多多学习。

function formatPromise(iterable) {
  for (let i = 0; i < iterable.length; i++) {
    if (!(iterable[i] instanceof Promise)) {
      iterable[i] = Promise.resolve(iterable[i])
    }
  }
}

function all(iterable) {
  const result = []
  if (iterable.length === 0) {
    return Promise.resolve()
  }
  formatPromise(iterable)
  return new Promise((resolve, reject) => {
    for (let i = 0; i < iterable.length; i++) {
      iterable[i]
        .then((res) => {
          result.push(res)
          if (i === iterable.length - 1) {
            resolve(result)
          }
        })
        .catch((err) => {
          reject(err)
        })
    }
  })
}

const promise1 = Promise.resolve(3)
const promise2 = 42
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "foo")
})
const promise4 = new Promise((resolve, reject) => {
  setTimeout(reject, 1000, "输出拒绝理由")
})

all([promise1, promise2, promise3, promise4])
  .then((res) => {
    console.log(res)
  })
  .catch((err) => {
    console.log(err)
  })
// 输出拒绝理由