异步求和

570 阅读1分钟

异步求和

假设有一台本地机器,无法做加减乘除运算(包括位运算),因此无法执行 a + b、a+ = 1 这样的 JS 代码, 然后我们提供一个服务器端的 HTTP API,可以传两个数字类型的参数,响应结果是这两个参数的和, 这个 HTTP API 的 JS SDK(在本地机器上运行)的使用方法如下:

asyncAdd(3, 5, (err, result) => {
  console.log(result); // 8
});

现在要求在本地机器上实现一个 sum 函数,支持以下用法:

(async () => {
  const result1 = await sum(1, 4, 6, 9, 2, 4);
  const result2 = await sum(3, 4, 9, 2, 5, 3, 2, 1, 7);
  const result3 = await sum(1, 6, 0, 5);
  console.log([result1, result2, result3]); // [26, 36, 12]
})();

解法

先弄个测试的function,模拟服务器随机延迟返回

function asyncAdd(a, b, cb) {
  setTimeout(() => {
    var result = a + b;
    cb && cb(null, result)
  } ,Math.random() * 1000)
}

自己实现个sendAddRequest,包一下

async function sendAddRequest(a, b) {
  return new Promise((resolve,reject) => {
    asyncAdd(a, b, (err, result) => {
      resolve(result);
    });
  });
}
async function sum() {
  const args = [].slice.call(arguments);
  let result = 0;
  
  while(args.length > 0) {
    result = await sendAddRequest(result,args.shift());
  }
  return result
}