基于asyncAdd函数实现支持多参数的异步sum求和函数
实现适配await的sum函数(基于回调式asyncAdd)
现有一个基于回调的异步加法函数asyncAdd,需求是实现一个支持await调用、可接收任意多个参数的sum函数,最终返回所有参数的求和结果。以下是完整解决方案:
修正后的原函数(修复随机延迟的写法错误)
function asyncAdd(a, b, cb) { setTimeout(() => { cb(null, a + b) }, Math.floor(Math.random() * 1000)); // 修正Math.random的调用方式,否则延迟时间无效 }
正确实现的sum函数
async function sum(...args) { // 将回调风格的asyncAdd包装为Promise风格 const promiseAdd = (a, b) => { return new Promise((resolve, reject) => { asyncAdd(a, b, (err, result) => { err ? reject(err) : resolve(result); }); }); }; let total = 0; // 串行执行异步加法,保证每一步求和都基于上一次的结果 for (const arg of args) { total = await promiseAdd(total, arg); } return total; }
测试代码(与需求一致)
(async() => { const result1 = await sum(1, 2, 3) const result2 = await sum(3, 5, 4, 7) console.log([result1, result2]) // 输出 [6, 21] })();
关键说明
- Promise化适配:
asyncAdd是回调式异步函数,无法直接用await,因此需要先将其包装为Promise风格的promiseAdd,通过Promise的resolve/reject来处理回调的结果和错误。 - 串行异步执行:使用
for...of循环配合await,确保每次异步加法都等待前一次完成后再执行,避免因异步并行导致的求和顺序错误,保证total的累加逻辑正确。 - 原函数修正:原
asyncAdd中的Math.floor(Math.random)缺少调用括号,会导致延迟时间为NaN(实际等效于0),修正为Math.floor(Math.random() * 1000)后才能产生0-999ms的随机延迟。
内容的提问来源于stack exchange,提问作者Vulpes
相关产品推荐
相关产品推荐

