You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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]
})();

关键说明

  1. Promise化适配:asyncAdd是回调式异步函数,无法直接用await,因此需要先将其包装为Promise风格的promiseAdd,通过Promise的resolve/reject来处理回调的结果和错误。
  2. 串行异步执行:使用for...of循环配合await,确保每次异步加法都等待前一次完成后再执行,避免因异步并行导致的求和顺序错误,保证total的累加逻辑正确。
  3. 原函数修正:原asyncAdd中的Math.floor(Math.random)缺少调用括号,会导致延迟时间为NaN(实际等效于0),修正为Math.floor(Math.random() * 1000)后才能产生0-999ms的随机延迟。

内容的提问来源于stack exchange,提问作者Vulpes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:50:15