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网站上的原题,里面有具体写法,也可以运行测试。

相关推荐
不会敲代码115 小时前
手写 Zustand:三十分钟带你搞懂状态管理库的核心原理
前端·javascript·源码
洛水水15 小时前
【力扣100题】30.二叉树的直径
算法·leetcode·职场和发展
神奇的程序员15 小时前
重构了自己5年前写的截图插件
前端·javascript·架构
橙淮15 小时前
从优化到安全再到未来 ——JavaScript 全维度技术指南
javascript
诚实可靠王大锤16 小时前
React Native 输入框与按钮焦点冲突解决方案(rn版本0.70.3)
前端·javascript·react native·react.js
洛水水18 小时前
【力扣100题】32.将有序数组转换为二叉搜索树
数据结构·算法·leetcode
如竟没有火炬18 小时前
用队列实现栈
开发语言·数据结构·python·算法·leetcode·深度优先
水木流年追梦19 小时前
大模型入门-应用篇3-Agent智能体
开发语言·python·算法·leetcode·正则表达式
洛水水19 小时前
【力扣100题】31.二叉树的层序遍历
算法·leetcode·职场和发展
洛水水19 小时前
【力扣100题】41.爬楼梯
算法·leetcode·职场和发展