编辑代码

/*
    提供一个 add 方法如下,需要实现一个 await sum(...args) 函数  
*/
function asyncAdd (a, b, callback) {
    setTimeout(() => {
        callback(null, a + b)
    }, 1000)
}

// 实现两数求和,返回是一个 promise
function sumT (a, b) {
    return new Promise((resolve, reject) => {
        asyncAdd(a, b, (err, res) => {
            if(!err) resolve(res)
            reject(err)
        })
    })
}
// (async () => {
//     const s = await sumT(1, 7)
//     console.log('两数求和:', s)
// })()


// 多数求和
function sum (...args) {
    return new Promise(resolve => {
        args.reduce((acc, cur) => acc.then(total => sumT(total, cur)), Promise.resolve(0)).then(resolve)
    })
}
// (async () => {
//     const s = await sum(1, 2, 3, 4, 5)
//     console.log('多数求和:', s)
// })()


// 使用 Promise.all 实现
async function sum2 (...args) {
    if (args.length === 0) return args[0]

    const result = []

    for (let i = 0; i < args.length - 1; i += 2) {
        result.push(sumT(args[i], args[i + 1]))
    }

    if (args.length % 2) result.push(args[args.length - 1])

    return sum(...await Promise.all(result))
}
(async () => {
    const s = await sum2(1, 2)
    console.log('多数求和:', s)
})()