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   XiSoil  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY



点击右上角即可分享
微信分享提示