多个数字异步求和

Tags
algorithm
Created
Jan 22, 2021 9:14 PM

// 已知异步求和函数只支持 2 个参数

function add(a, b) {
  return new Promise(res => setTimeout(() => res(a + b), Math.random() * 1000))
}

// 实现多个数字求和

// 无限制并发任务;无等待消耗参数;

async function sum(...arg) {
  const numbs = [...arg];
  const tasks = new Set();
  let result = 0;
  const addTask = (a, b) => {
    const task = add(a, b).then(n => {
      tasks.delete(task);
      result = n;
      return n;
    });
    tasks.add(task);
  };
  for (let i = 1; i < numbs.length; i += 2) {
    addTask(numbs.pop(), numbs.pop())
  }
  while (tasks.size) {
    const n = await Promise.race([...tasks])
    if (numbs.length) {
      addTask(numbs.pop(), n);
    } else {
      numbs.push(n);
    }
  }
  return result;
}
SuperMade with Super