批量请求

请实现如下的函数,可以批量请求数据,所有的URL地址在urls参数中,同时可以通过max参数控制请求的并发度,当所有请求结束之后,需要执行callback回调函数,发请求的函数可以直接使用fetch即可。function sendRequest(urls:string[],max: number, callback: ()=> void){}

function sendRequest(urls, max, callback) {
  let count = urls.length; // 记录还未完成请求的数量
  let index = 0; // 记录当前请求的索引
  let results = []; // 记录所有请求的结果

  function handleRequest() {
    if (index >= urls.length) {
      // 所有请求都已完成
      callback(results);
      return;
    }

    const url = urls[index];
    index++;

    fetch(url)
      .then(response => response.json())
      .then(data => {
        results.push(data);
        count--;

        if (count === 0) {
          // 当前并发请求数量已达到最大值,等待其中一个请求完成后再继续发起新的请求
          handleRequest();
        }
      })
      .catch(error => {
        console.error(`请求 ${url} 失败:${error}`);
        count--;

        if (count === 0) {
          // 当前并发请求数量已达到最大值,等待其中一个请求完成后再继续发起新的请求
          handleRequest();
        }
      });
  }

  // 先发起 max 个请求
  for (let i = 0; i < max; i++) {
    handleRequest();
  }
}

注:

这个函数接收三个参数:

  • urls:一个包含所有请求地址的字符串数组。
  • max:最大并发请求数量。
  • callback:所有请求完成后的回调函数,它接收一个参数 results,是一个包含所有请求结果的数组。

函数的实现思路是:

  • 先定义三个变量:count 记录还未完成请求的数量,index 记录当前请求的索引,results 记录所有请求的结果。
  • 定义一个 handleRequest 函数,用于发起单个请求。如果当前并发请求数量已达到最大值,就等待其中一个请求完成后再继续发起新的请求。
  • 先发起 max 个请求,然后等待它们完成。每当一个请求完成时,就将其结果存入 results 数组中,并将 count 减一。如果此时还有未完成的请求,就继续发起新的请求。
  • 当所有请求都已完成时,调用回调函数 callback,并将 results 数组作为参数传入。
posted @ 2023-07-11 17:08  Hailey_hwx  阅读(51)  评论(0)    收藏  举报