并发请求数控制

30 阅读1分钟
function createTask(i) {
  return () => new Promise(res => {
    console.log(`task${i} start`);
    setTimeout(() => {
      res(i);
      console.log(i);
    }, i * 1000);
    console.log(`task${i} end`);
  });
}

async function runTasks() {
 const tasks = Array(5).fill(null).map((item, idx) => {
    return createTask(idx);
  })
 const res = await run(tasks, 2);
 console.log(res);
}

runTasks();

async function run(tasks, maxTask) {
  return new Promise((resolve) => {
    if (!tasks.length) {
    res([]);
    return;
  }
  let nowIndex = 0;
  let count = 0;
  const result = [];
  const min = Math.min(tasks.length, maxTask);
  function request(index) {
    nowIndex ++;
    tasks[index]().then(res => {
      // 保存每个请求的执行结果
      result[index] = res;
      count ++;
      if (count === tasks.length) {
        resolve(result);
      } else {
        // 执行接下来的任务
       request(nowIndex); 
      }
    })
  }
  for(let i = 0; i < min; i ++) {
    request(i);
  }
  })
}