前言
契机:最近在搞微前端,在调研各种解决方案,思考如何整合公司目前的项目,头都大了。想换换脑子,决定每天在leetcode网站随机刷一道题。
希望自己可以坚持下去吧,也不用多久,21天即可。
刷题还蛮有意思的,当完成一道题的解法时,还蛮有成就感的。
就是玩,题目随机~
题目
思路
从题干中我们可以得到以下信息:
- 输入参数是一个数组,数组中是一个个
promise
函数 - 返回值是一个
promise
函数 - 数组中的所有
promise
函数并行执行,全部成功后将每个函数返回的结果,按照数组中函数的顺序组成一个结果数组返回,若有一个函数执行失败,立即用错误拒绝该promise
。
解题方法
promiseAll
函数返回一个新的promise
- 若参数
functions
为空数组时,返回[] - 定义一个数组
res
,长度就是传入数组的长度,初始值为null
, 用于记录数组中的函数全部执行成功后的结果 - 定义一个
resolveCount
记录完成resolve
的函数的数量,当resolveCount
等于输入数组的长度时,返回res
- 为了拿到数组中所有函数执行完毕后的值,故需要使用
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网站上的原题,里面有具体写法,也可以运行测试。