js如何实现并发控制

84 阅读1分钟

思路

  1. 同时发送的最大请求数MAX
  2. 请求结束后,立即发起下一个请求
  3. 请求结果顺序保存

方案一

通过for循环创建max个请求,请求结束后发起新的请求(递归)。直到请求数组为空。最终用promise.all保证所有的请求都结束

async function executeUrls(urls, max, callback) {
  const results = [];
  let running = 0;

  async function execute(url) {
    const result = await fetch(url); // 假设这里使用 fetch 函数获取数据
    results.push(result); // 结果push,通过index对应result和请求
    running--; // 正在执行的数量减1

    if (urls.length > 0) { // 如果当前的url还没有执行完
      execute(urls.shift()); // 继续执行
      running++; // 执行数量+1
    } else if (running === 0) { // 所有的url已经执行结束
      callback(results); // 执行回掉
    }
  }

  const promises = [];
  for (let i = 0; i < max; i++) {
    if (urls.length > 0) {
      const url = urls.shift(); // 出队
      promises.push(execute(url)); // promise队列入队一个promise请求
      running++; // 正在执行的数量++
    }
  }

  await Promise.allSettled(promises);
}

Promise实现

for循环遍历请求数组,push请求到promiseList,每个请求结束后再开始一个新的请求,达到最大值使用promise.race await 住。