SOURCE

let cash = {}

function isUndefined(target){
    return target === void 0
}

// 异步加法
function asyncAdd(a, b, cb) {
    setTimeout(() => {
        cb(null, a + b)
    }, Math.random() * 1000)
}

async function total() {
    const res1 = await sum(1, 2, 3, 4, 5, 6, 4)
    console.log(res1)
    const res2 = await sum(1, 2, 3, 4, 5, 6, 4)
    console.log(res2)
    return [res1, res2]
}

total()

// 实现下 sum 函数。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。尽可能的优化这个方法的时间。
async function sum(...args) {
    let key = args.join('+')
    if(!isUndefined(cash[key])){
        return cash[key]
    }
    let res = 0
    for (let n of args) {
        res = await add(n, res)
    }
    cash[key] = res
    return res
}

function add(a, b) {
    return new Promise(((resolve, reject) => asyncAdd(a, b, (err, num) => {
        if (err) {
            return reject(err)
        }
        resolve(num)
    })))
}
console 命令行工具 X clear

                    
>
console