专业的编程技术博客社区

网站首页 > 博客文章 正文

实现Promise.all(实现promise要判断环境)

baijin 2024-08-14 11:57:13 博客文章 4 ℃ 0 评论
  1. 返回的是一个 Promise 实例
  2. 参数是数组或者具备 Iterator 接口的数据,数组中的每项为一个 Promise 实例,如果不是则使用 Promise.resolve 转换成 Promise实 例
  3. 实例的状态由数组每项的 Promise 状态决定,当其全部是 fulfilled 时,实例的状态才会变成 fulfilled,如果有一个是 rejected,实例的状态即为 rejected,返回值即为第一个被 rejected 的实例的返回值

实现如下:

Promise.all = function (promises) {
  return new Promise((resolve, reject) => {
    let result = [], cnt = 0
    if (promises.length === 0) {
      resolve(result)
      return
    }
    promises.forEach((promise, index) => {
      Promise.resolve(promise).then(res => {
        result[index] = res
        cnt++
        if (cnt === promise.length) {
          resolve(result)
        }
      }).catch(err => {
        reject(err)
      })
    })
  })
}

当参数是具备 Iterator 接口时的,此处以 Set 作为示例

const set = new Set([])
const p1 = new Promise(resolve => {
  setTimeout(() => {
    resolve(1)
  }, 1000)
})
const p2 = new Promise(resolve => {
  setTimeout(() => {
    resolve(2)
  }, 2000)
})
set.add(p1)
set.add(p2)
Promise.all(set).then(result => console.log(result)) // [1, 2]

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表