编辑代码


//  https://mp.weixin.qq.com/s/33u8A2p7U2pnVueEwNBOPg


// 异步加法
function asyncAdd(a, b, cb) {
   setTimeout(() => {
      cb(null, a + b)
   }, Math.random() * 1000)
}
// asyncAdd(1,2,(err,res)=>{
//     console.log(12,res)
// })


async function total() {
   const res1 = await sum(1, 2, 3, 4, 5, 6, 4)
   const res2 = await sum(1, 2, 3, 4, 5, 6, 4)
   console.log(19,[res1,res2])
   return [res1, res2]
}
console.time()
let cash = new Map()
total()
console.timeEnd()



// 实现下 sum 函数。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。尽可能的优化这个方法的时间。
async function sum(...args) {
    console.log(31,cash , cash.has(args))
    let key = args.join(',')
    if(cash.has(key)){
        console.log(22,args)
        return cash.get(args)
    }else{
        let res = 0 
        for(let n of args){
            res = await caculate(res,n)
        }
        cash.set(key,res)
        console.log(42,args, res)
        return res
    }
}

function caculate (num1,num2){
    return new Promise ((resolve,reject) =>{
        asyncAdd(num1,num2,(err,res) =>{
            if(err){
                reject(err)
                return 
            }
            resolve(res)
        })
    })
}