# 实现一个批量请求函数 multiRequest

实现要求:

  • 要求最大并发数 maxNum
  • 每当有一个请求返回,就留下一个空位,可以增加新的请求
  • 所有请求完成后,结果按照 urls 里面的顺序依次打出
/**
 * 
 * @param {*} urls 全部请求地址
 * @param {*} maxNum 最大并发请求数
 * @returns 
 */
function multiRequest(urls, maxNum) {
  const ret = [];
  let i = 0;
  let resolve;

  const promise = new Promise(r => resolve = r);

  const addTask = () => {
    if (i >= urls.length) {
      return resolve();
    }

    const task = request(urls[i++]).finally(() => {
      addTask();
    });
    ret.push(task);
  }

  while (i < maxNum) {
    addTask();
  }

  return promise.then(() => Promise.all(ret));
}

// 模拟请求
function request(url) {
  return new Promise((r) => {
    const time = Math.random() * 1000;
    setTimeout(() => r(url), time);
  });
}