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

相关推荐
kyriewen11 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
free3511 小时前
从 0 实现一个 Tiny JavaScript VM:项目架构拆解
javascript
徐小夕13 小时前
我们开源了一款“框架无关”的思维导图编辑器,3分钟集成到任意系统
前端·javascript·github
PBitW13 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
像我这样帅的人丶你还14 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
labixiong14 小时前
还原一个完整符合规范的 Promise(二)
前端·javascript
To_OC15 小时前
万字解析《JS 语言精粹》之第五章:继承 5 大核心精髓(JS 原型核心)
前端·javascript·代码规范
裕波16 小时前
AI 正在重写应用开发。Vue 与 Vite,给出新的答案。
javascript·vue.js
kyriewen17 小时前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
张元清20 小时前
React useDebounce Hook:给状态和回调做防抖(2026)
javascript·react.js