异步求和
假设有一台本地机器,无法做加减乘除运算(包括位运算),因此无法执行 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
}