promise实现一个批量请求队列

2,059 阅读1分钟
要求如下:
要求最大并发数 maxNum
每当有一个请求返回,就留下一个空位,可以增加新的请求所有请求完成后,
结果按照 urls 里面的顺序依次打

urls // 请求数组
maxNum //同时最大请求数

function multiRequest(urls, maxNum) {
  const ret = [];
  let i = 0;
  let resolve;
  const promise = new Promise(r => resolve = r);
  const addTask = () => {
    if (i >= arr.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);
  });
}