实现并发请求控制(优化版)

542 阅读1分钟

实现一个批量请求函数 multiRequest(urls, maxNum),要求如下: • 要求最大并发数 maxNum • 每当有一个请求返回,就留下一个空位,可以增加新的请求 • 所有请求完成后,结果按照 urls 里面的顺序依次打出

上面的代码不够好,看下面这个版本的

// 解答:使用递归和队列----------------------------------------------

// 模拟异步请求函数
function request(index) {
  console.log(`请求 ${index} 开始`);
  return new Promise((resolve) => {
    // 模拟请求耗时
    const time = Math.random() * 2000 + 1000;
    setTimeout(() => {
      console.log(`请求 ${index} 完成`);
      resolve(index);
    }, time);
  });
}

// 处理请求队列
async function processRequests(requests) {
  const results = [];
  let index = 0;

  async function sendNext() {
    if (index >= requests.length) return;
    const currentIndex = index++;
    const result = await requests[currentIndex]();
    results[currentIndex] = result;
    // 递归调用发送下一个请求
    await sendNext();
  }

  // 同时启动三个请求
  const initialPromises = Array.from({ length: Math.min(3, requests.length) }, sendNext);
  await Promise.all(initialPromises);

  return results;
}

// 创建请求数组
const requests = Array.from({ length: 10 }, (_, i) => () => request(i));

// 处理请求
processRequests(requests).then((results) => {
  console.log('所有请求完成,结果按顺序排列:', results);
});
// 请求 0 开始
// 请求 1 开始
// 请求 2 开始
// 请求 1 完成
// 请求 3 开始
// 请求 0 完成
// 请求 4 开始
// 请求 3 完成
// 请求 5 开始
// 请求 2 完成
// 请求 6 开始
// 请求 4 完成
// 请求 7 开始
// 请求 6 完成
// 请求 8 开始
// 请求 5 完成
// 请求 9 开始
// 请求 7 完成
// 请求 8 完成
// 请求 9 完成
// 所有请求完成,结果按顺序排列: [
//   0, 1, 2, 3, 4,
//   5, 6, 7, 8, 9
// ]

完结撒花~~