当前位置: 首页 > 科技观察

一道字节笔试题,实现一个异步求和函数

时间:2023-03-12 23:58:28 科技观察

题目:提供异步add方法如下,需要实现一个awaitsum(...args)函数:functionasyncAdd(a,b,callback){setTimeout(function(){callback(null,a+b);},1000);}化简:两数之和我们先来简单实现一个异步的两数之和函数functionsumT(a,b){returnawaitnewPromise((resolve,reject)=>{asyncAdd(a,b,(err,res)=>{if(!err){resolve(res)}reject(err)})})}//testconsttest=awaitsumT(1,2)console.log(test)//3深化:求和majority上面我们实现了两个数的和,然后推广到majority的和?说到数组求和的问题,我们首先想到的是reducereduce()方法对数组中的每个元素(升序)执行你提供的reducer函数,将其结果聚合成一个单一的返回值.——MDNarr.reduce(callback(acc,cur[,idx[,arr]])[,initialValue])回调函数接收4个参数:acc:累加器cur:当前值idx:当前索引arr:源数组其中,initialValue可选,如果有initialValue:acc取initialValue的值,cur取数组第一个值如果没有:acc取数组第一个值,cur取数组第二个值constarr=[1,2,3,4];construducer=(acc,cur)=>acc+cur;//1+2+3+4console.log(arr.reduce(reducer));//输出:10//5+1+2+3+4console.log(arr.reduce(reducer,5));//Output:15关于本题:来自@champkeh将初始值设置为Promise.resolve(0),5次求和后:functionssum(...args){returnnewPromise(resolve=>{args.reduce((acc,cur)=>acc.then(total=>sumT(total,cur)),Promise.resolve(0)).then(resolve)})}//测试waitsum(1,2,3,4,5)//15但是有个耗时的问题,我们可以计算一下时间:console.time("sum")//testwaitsum(1,2,3,4,5)//15console.timeEnd("sum")也就是说每次sum我们都会花费1s,串行异步求和,这显然不是最好的优化:使用Promise.all我们可以使用Promise。全部求和,然后继续两两求和...,直到只剩下一个就是最后的结果asyncfunctionsum(...args){//用来检查每次迭代的过程console.log(args)//如果只有一个,直接returnif(args.length===1)returnargs[0]letresult=[]//两个两个,如果还剩一个,直接输入for(leti=0;i