leetcode | 手写Promise.all()函数(第一天)

前言

契机:最近在搞微前端,在调研各种解决方案,思考如何整合公司目前的项目,头都大了。想换换脑子,决定每天在leetcode网站随机刷一道题。

希望自己可以坚持下去吧,也不用多久,21天即可。

刷题还蛮有意思的,当完成一道题的解法时,还蛮有成就感的。

就是玩,题目随机~

题目

思路

从题干中我们可以得到以下信息:

  1. 输入参数是一个数组,数组中是一个个promise函数
  2. 返回值是一个promise函数
  3. 数组中的所有promise函数并行执行,全部成功后将每个函数返回的结果,按照数组中函数的顺序组成一个结果数组返回,若有一个函数执行失败,立即用错误拒绝该promise

解题方法

  1. promiseAll函数返回一个新的promise
  2. 若参数functions为空数组时,返回[]
  3. 定义一个数组res,长度就是传入数组的长度,初始值为null, 用于记录数组中的函数全部执行成功后的结果
  4. 定义一个resolveCount记录完成resolve的函数的数量,当resolveCount等于输入数组的长度时,返回res
  5. 为了拿到数组中所有函数执行完毕后的值,故需要使用async await来处理, 使用try...catch来捕获错误,结束promise

代码

js 复制代码
/**
 * 重写promise内置函数Promise.all()功能
 * @param {Array<Function>} functions
 * @return {Promise<any>}
 */
const promiseAll = async function(functions) {
    return new Promise((resolve,reject) => {
        if(functions.length === 0) {
            resolve([])
            return
        }

        // 传入的数组长度
        let len = functions.length
        // 根据传入的函数的个数生成对应的数组个数,初始化值为null
        const res = new Array(len).fill(null)
        // 已完成resolve的函数个数
        let resolvedCount = 0

        functions.forEach(async (fun,index) => {
            try {
                const result = await fun()

                // 为什么不使用push?这种方式可以按照顺序将返回结构放置进结果数组中
                res[index] = result
                resolvedCount++

                // 全部函数都成功后将结果以数组形式返回
                if(functions.length === resolvedCount) {
                    resolve(res)
                }
            } catch (err) {
                reject(err)
            }

        })
    })
    
};

/**
 * const promise = promiseAll([() => new Promise(res => res(42))])
 * promise.then(console.log); // [42]
 */

后记

并行执行异步函数是leetcode网站上的原题,里面有具体写法,也可以运行测试。

相关推荐
Maimai1080814 分钟前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
candyTong17 分钟前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
失去的青春---夕阳下的奔跑3 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
卡卡军3 小时前
agmd 1.0 重磅升级——Rust 重写,性能起飞
javascript·rust
Larcher3 小时前
🔥 告别抓瞎:用 Claude Code (cc) 优雅接手与维护已有项目
javascript·机器学习·前端框架
JYeontu3 小时前
轮播图不够惊艳?试下这个立体卡片轮播图
前端·javascript·css
亲亲小宝宝鸭4 小时前
如何监听DOM尺寸的变化?element-resize-detector 和 resizeObserver
前端·javascript
m0_629494734 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
卷帘依旧6 小时前
Generator 全面解析 + async/await 深度对比
前端·javascript
吃着火锅x唱着歌6 小时前
LeetCode 1019.链表中的下一个更大节点
算法·leetcode·链表