Promise.all() 是 JavaScript 中的一个内置方法,它接受一个 Promise 可迭代对象,并返回一个新的 Promise。这个新 Promise 仅在可迭代对象中的所有 Promise 都已成功时才会被满足,或者在可迭代对象中的任何 Promise 被拒绝时立即被拒绝。Promise.all()Promise 的值是可迭代对象中已满足的 Promise 的值的数组,按照可迭代对象中 Promise 的顺序排列。

  1. promiseAll 函数返回一个新 Promise

  2. 如果输入数组为空,立即用一个空数组解析它并返回。

  3. 初始化一个数组 res 以保存结果,最初填充为 null

  4. 初始化一个 resolvedCount 变量,用于跟踪已解析的 Promise 数。

  5. 迭代 Promise 返回函数的数组。对于每个返回 Promise 的函数:

    1. async/await 版本中,等待 Promise。在解析时,将结果放入 res 数组中的相应位置并增加 resolvedCount。如果引发错误,立即用错误拒绝 Promise
    2. then/catch 版本中,附加一个 then 子句和一个 catch 子句。在解析时,then 子句将结果放入 res 数组中并增加 resolvedCountcatch 子句用错误拒绝 Promise

async/await 写法

const promiseAll = function(functions) {
    return new Promise(function(resolve, reject) {
        if (functions.length === 0) {
            return resolve([])
        }

        const res = new Array(functions.length).fill(null)

        let resolvedCount = 0

        functions.forEach(async function(el,index) {
            try{
                res[index] = await el()
                resolvedCount++
                if (resolvedCount === functions.length) {
                    resolve(res)
                }
            } catch (error) {
                reject(error)
            }
        })
    })
}

then/catch 写法

const promiseAll = function (functions) {
    return new Promise((resolve, reject) => {
        if (functions.length === 0) {
            return resolve([])
        }

        const res = new Array(functions.length).fill(null)

        let resolvedCount = 0

        functions.forEach((el,index) => {
            el().then((itemResult) => {
                res[index] = itemResult
                resolvedCount++
                if (resolvedCount === functions.length) {
                    resolve(res)
                }
            }).catch((err) => {
                return reject(err)
            })
        })
    })
}
posted on 2024-08-21 21:11  XiSoil  阅读(18)  评论(0编辑  收藏  举报