首页 > 其他分享 >实现一个批量请求函数 multiRequest(urls, maxNum)

实现一个批量请求函数 multiRequest(urls, maxNum)

时间:2024-12-15 09:54:45浏览次数:8  
标签:maxNum 请求 multiRequest results requestBatch Promise urls

在前端开发中,处理多个异步请求的一种常见需求是批量请求,并限制并发请求的数量以避免对服务器造成过大压力或浏览器资源耗尽。你可以使用 Promise.allArray.prototype.mapArray.prototype.reduce 等方法来实现一个批量请求函数 multiRequest,该函数接受一个 URL 数组和一个最大并发请求数 maxNum

以下是一个可能的实现:

function multiRequest(urls, maxNum) {
  const makeRequest = url => fetch(url).then(response => response.json());

  // 使用reduce实现批量请求控制
  const requestBatch = (urls = [], index = 0, maxConcurrent = maxNum, results = []) => {
    if (index >= urls.length) {
      return Promise.resolve(results);
    }

    const batchEnd = Math.min(index + maxConcurrent, urls.length);
    const batch = urls.slice(index, batchEnd).map(makeRequest);

    return Promise.all(batch).then(batchResults => {
      return requestBatch(urls, batchEnd, maxConcurrent, results.concat(batchResults));
    });
  };

  return requestBatch(urls);
}

// 使用示例
const urls = [
  'https://jsonplaceholder.typicode.com/todos/1',
  'https://jsonplaceholder.typicode.com/todos/2',
  'https://jsonplaceholder.typicode.com/todos/3',
  'https://jsonplaceholder.typicode.com/todos/4',
  'https://jsonplaceholder.typicode.com/todos/5'
];

multiRequest(urls, 2).then(results => {
  console.log(results);
}).catch(error => {
  console.error('Error fetching data:', error);
});

解释

  1. makeRequest 函数:这是一个辅助函数,用于创建单个请求并返回一个 Promise,该 Promise 解析为请求的 JSON 响应。

  2. requestBatch 函数:这是一个递归函数,用于控制并发请求的数量。它接受四个参数:

    • urls:要请求的 URL 数组。
    • index:当前处理的 URL 数组的索引。
    • maxConcurrent:允许的最大并发请求数。
    • results:收集到的请求结果数组。
  3. 批量处理

    • 首先检查是否处理完所有 URL,如果是,则返回结果数组。
    • 否则,根据 maxConcurrent 确定当前批次处理的 URL 数量,并发出这些请求。
    • 使用 Promise.all 等待当前批次的所有请求完成,然后将结果合并到 results 数组中,并递归调用 requestBatch 处理下一个批次。
  4. 返回 PromisemultiRequest 函数返回 requestBatch 的调用结果,该结果是一个 Promise,解析为所有请求的结果数组。

通过这种方式,你可以有效地控制并发请求的数量,同时处理多个异步请求。

标签:maxNum,请求,multiRequest,results,requestBatch,Promise,urls
From: https://www.cnblogs.com/ai888/p/18607660

相关文章

  • Django视图与URLs路由详解
            在DjangoWeb框架中,视图(Views)和URLs路由(URLrouting)是Web应用开发的核心概念。它们共同负责将用户的请求映射到相应的Python函数,并返回适当的响应。本篇博客将深入探讨Django的视图和URLs路由系统,提供实际的代码示例和操作指导,确保读者能够具体而实际地了解如......
  • 314 API Versions 01(UrlSegmentApiVersionReader)
    示例1、准备两个版本的CitiesController.cs删除不在需要的TestController.csControllers文件夹下新建v1文件夹,将CitiesController.cs移动到v1中,弹出的对话框点击OK和Yes;新建v2文件夹,拷贝一份CitiesController.cs,命名空间改成v2;v2CitiesController.cs如下usingSyste......
  • dedecms图集dede:field name='imgurls'不能二次使用的解决办法
    {dede:fieldname='imgurls'alt='图片输出区'}图片链接 [field:linkurl/]图片地址[field:imgsrc/]{/dede:field}这个标签不能同时使用2次,所以第二次的话用!!!{dede:productimagelist}图片链接 [field:linkurl/]图片地址[field:imgsrc/]{/dede:productimagelist}   ......
  • URLSearchParams使用实践,URLSearchParams实现url参数字符转js对象,获取属性等功能
    constparams=newURLSearchParams();//实现js参数转urlcode编码,直接可以传到url去请求params.append('param1','value1');params.append('param2','value2');console.log(params.get('param1'))//获取到参数了consturlObject=ne......
  • CentOS Linux 8x 错误:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare interna
    问题描述今天安装CentOS8.5安装完之后,准备更新源仓库环境的时候突然出现错误:为仓库'appstream'下载元数据失败:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist,后面我找了好久没发现有解决这个问题的方法,后面无意看到了https://www.cnblogs.com/cainiaoaixuexi......
  • Javascript:如何替换 urls 和 youtube urls,并将 urls 替换为锚标签,将 youtube urls 替
    如果字符串返回:str=``https://www.google.comhttp://google.comhttps://www.youtube.com/live/gNIQWYgf-0https://www.youtube.com/embed/3ul2LYG6j14?si=fgxYHjyt6zBmoYErhttps://youtu.be/75Dhfjf6hfjfj这还必须考虑到......
  • URLSearchParams:url查询处理工具
    letparams=newURLSearchParams(a=1&b=2&c=3#hash)方法和属性:.get('').has('')//返回true/false.append(name,value)//向URL中添加新的参数.set(name,value)//设置指定参数的值,如果参数不存在则添加新参数.delete(name)//删除指定名称的参数.key()......
  • centos8报错错误:为 repo 'appstream' 下载元数据失败 : Cannot prepare internal mirr
    出现如下错误的错误:为repo‘appstream’下载元数据失败:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist原因在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS8的所有包。CentOS8已于2021年12月31日寿终正非,但软件包仍在官方镜像上保留了一段时间。现在......
  • uniapp-设置UrlSchemes从外部浏览器H5打开app
    需求:外部浏览器H5页面,跳转到uniapp开发的原生app内部。1、uniapp内部的配置:(1)打开manifest->App常用其他设置,如下,按照提示输入您要设置的urlSchemes:(2)填写配置之后,可到manifest->源码试图查看,如下:(3)uniapp中修改了manifest配置之后,一定要重新打包,然后再运行到手机,否则可......
  • CentOS8使用yum报错:Cannot prepare internal mirrorlist: No URLs in mirrorlist
    CentOS8使用yum报错:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist报错信息:错误:为仓库'appstream'下载元数据失败:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist 出现这个问题的原因是:在2022年1月31日,CentOS从官方镜像中移除CentOS8的所......