前端技术-并发请求

news2024/11/26 18:25:19

并发请求

代码解释

定义了一个函数 concurRequest,用于并发请求多个 URL 并返回它们的响应结果。

function concurRequest(urls, maxNum) {
  return new Promise((resolve, reject) => {
    if (urls.length === 0) {
      resolve([]);
      return;
    }

    const results = [];

    let index = 0; // 下一个请求下标
    let count = 0; // 请求完成数

    // 发送请求
    async function request() {
      // 当index等于数组的长度表示完成
      if (index === urls.length) return;

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

定义了一个名为 concurRequest 的函数,它接受两个参数:一个 URL 数组和一个最大并发数。函数返回一个 Promise 对象,该对象在所有请求完成时解决并返回响应结果数组。

该函数首先检查 URL 数组是否为空,如果为空,则立即解决 Promise 并返回一个空数组。否则,它定义了一个名为 results 的空数组,用于存储每个 URL 的响应结果。它还定义了两个变量 indexcount,分别用于跟踪下一个请求的下标和已完成的请求数。

接下来,它定义了一个名为 request 的异步函数,用于发送请求。当 index 等于 URL 数组的长度时,表示所有请求都已完成,函数将立即返回。

在函数内部,它首先将 index 的值赋给 i,然后将 urls[index] 的值赋给 url,并将 index 的值递增。这样做是为了确保在请求完成之前,i 的值与 index 的值相同。

      try {
        const response = (await fetch(url)).json();
        results[i] = await response;
      } catch (error) {
        console.log(error.message);
      } finally {
        count++;

        // 判断所有请求是否都完成
        if (count === urls.length) {
          resolve(results);
        }
        request();
      }
      console.log(results);
    }

接下来,它使用 fetch 函数发送一个 GET 请求,并将响应转换为 JSON 格式。它将响应结果存储在 results[i] 中,并将 count 的值递增。无论请求成功或失败,都会递增 count 的值。

finally 代码块中,它检查是否已完成所有请求。如果是,则解决 Promise 并返回响应结果数组。否则,它再次调用 request 函数以发送下一个请求。

最后,它在控制台中记录响应结果数组,并在函数的末尾调用 request 函数以开始发送第一个请求。

整体代码展示

/**
 * 并发请求
 * @param {string[]} url 待请求的 url 数组
 * @param {number} maxNum 最大并发数
 */
function concurRequest(urls, maxNum) {
  return new Promise((resolve, reject) => {
    if (urls.length === 0) {
      resolve([]);
      return;
    }

    const results = [];

    let index = 0; // 下一个请求下标
    let count = 0; // 请求完成数

    // 发送请求
    async function request() {
      // 当index等于数组的长度表示完成
      if (index === urls.length) return;

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

      try {
        const response = (await fetch(url)).json();
        results[i] = await response;
      } catch (error) {
        console.log(error.message);
      } finally {
        count++;

        // 判断所有请求是否都完成
        if (count === urls.length) {
          resolve(results);
        }
        request();
      }
      console.log(results);
    }

    const times = Math.min(maxNum, urls.length);
    for (let i = 0; i < times; i++) {
      request();
    }
  });
}

const urls = [];
for (let i = 1; i <= 30; i++) {
  const url = `https://jsonplaceholder.typicode.com/todos/${i}`;
  urls.push(url);
}

concurRequest(urls, 6).then((response) => {
  console.log(response);
});

在这里插入图片描述

输出结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

水果店在微信小程序中可以实现什么功能

一、开发背景 随着移动支付的普及和消费者需求的不断变化&#xff0c;越来越多的水果店开始关注线上销售和数字化运营。微信小程序作为一种轻量级应用&#xff0c;无需下载安装&#xff0c;即可实现与客户的无缝衔接。因此&#xff0c;开发一款针对水果店的微信小程序&#xff…

限制LitstBox控件显示指定行数的最新数据(1/3)

工作表Sheet1中的数据表共有3列&#xff0c;行数不确定&#xff0c;现需要将数据加载到用户窗体的ListBox控件中&#xff0c;设置控件的相关属性属性如下所示。 控件属性属性值ColumnCount3ColumnHeadsTrueRowSourceSheet1!A2:C15 窗体显示效果如下图所示&#xff0c;这里有一…

项目中 .env.development 与 .env.production 的区别

文章目录 一、项目中使用此两个文件的意义二、使用方式 一、项目中使用此两个文件的意义 我们在开发项目时&#xff0c;经常会有开发环境与生产环境&#xff0c;分别会对应不同的请求地址与各种不同的变量&#xff0c;这个时候我们就可以使用 process.env 去抓取这两个文件写的…

以漫画形式解说面向对象:把复杂的概念用简单有趣的画面呈现,启发你的思维

面向对象是什么 面向对象&#xff08;Object Oriented&#xff0c;OO&#xff09;的思想是软件开发中极其重要的概念和应用&#xff0c;它早已超越了程序设计和软件开发的范畴&#xff0c;延伸至数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技…

2023_Spark_实验十九:SparkStreaming入门案例

SparkStreaming入门案例 一、准备工作 二、任务分析 三、官网案例 四、开发NetWordCount 一、准备工作 实验环境&#xff1a;netcat 安装nc&#xff1a;yum install -y nc 二、任务分析 将nc作为服务器端&#xff0c;用户产生数据&#xff1b;启动sparkstreaming案例中的客户端…

BOSHIDA DC电源模块关于电容器的电解液位置

BOSHIDA DC电源模块关于电容器的电解液位置 DC电源模块中的电容器扮演着一个非常重要的角色&#xff0c;它们能够对电路提供稳定的电源电压&#xff0c;同时也可以作为电路中的滤波器&#xff0c;去除电路中的噪声和纹波。在DC电源模块中使用的电容器通常是电解型电容器&#…

unity(WebGL) 截图拼接并保存本地,下载PDF

截图参考&#xff1a;Unity3D 局部截图、全屏截图、带UI截图三种方法_unity 截图_野区捕龙为宠的博客-CSDN博客 文档下载&#xff1a; Unity WebGL 生成doc保存到本地电脑_unity webgl 保存文件_野区捕龙为宠的博客-CSDN博客 中文输入&#xff1a;Unity WebGL中文输入 支持输…

2023_Spark_实验十八:安装FinalShell

下载安装包 链接&#xff1a;https://pan.baidu.com/s/14cOJDcezzuwUYowPsOA-sg?pwd6htc 提取码&#xff1a;6htc 下载文件名称&#xff1a;FinalShell.zip 二、安装 三、启动FinalShell 四、连接远程 linux 服务器 先确保linux系统已经开启&#xff0c;不然连接不上 左边…

Linux离线安装Apache HTTP

准备工作 下载apr、apr-util、pcre、httpd包 apr、apr-util下载, 如下图: pcre下载,如下图: httpd下载 ,如下图: 开始安装 1. 安装编译apr [rootlocalhost ~]# cd /usr/local [rootlocalhost local]# tar -zxvf apr-1.7.4.tar.gz -C ./ [rootlocalhost local]# cd apr…

apple pencil买不买?ipad第三方电容笔推荐

相信很多学生党的学习都离不开iPad&#xff0c;然而电容笔&#xff0c;自然也是是必不可少的。至于真的Apple Pencil&#xff0c;那就更贵了&#xff0c;一支就要一千多块钱&#xff0c;普通人可买不起。国内的电容笔已经做得很好了&#xff0c;虽然不像苹果原装电容笔那样&…

186_Power BI Desktop 支持计算组编辑

186_Power BI Desktop 支持计算组编辑 一、背景 今天是2023年10月16日&#xff0c;基本上是 Power BI 每月更新的时间点了。打开看到 Power BI 果然已经更新到了2023年10月版本&#xff1a;2.122.746.0 (23.10) (x64) 这里提一下&#xff0c;我使用的是商店版的 Power BI De…

多线程中ThreadPoolExecutor.map()中传递多个参数

with concurrent.futures.ThreadPoolExecutor(max_threads) as executor:results executor.map(get_captcha_image, ip_addrs, [img_url] * len(ip_addrs)) #要传入多个参数时&#xff0c;每个参数都得是固定相同长度的可迭代对象# 收集结果for result in results:print(resul…

便利店小程序可以做哪些营销活动呢

在当今这个数字化时代&#xff0c;微信小程序已经成为了人们日常生活的一部分。对于便利店来说&#xff0c;拥有一个优秀的小程序不仅可以提高销售&#xff0c;还可以扩大品牌影响力&#xff0c;增加客户粘性。本文将探讨便利店小程序可以做什么样的营销活动&#xff0c;如何利…

智慧饭堂报餐系统源码 智慧食堂源码

智慧饭堂报餐系统源码 智慧食堂源码 技术栈 1、前端技术栈&#xff1a;ES6、vue、vuex、vue-router、vue-cli、axios、element-ui 2、后端技术栈&#xff1a;SpringBoot、MyBatis、Spring Security、Jwt 介绍 一款java开发的智慧饭堂报餐系统&#xff0c;支持连接人脸识别…

分享一下微信报名系统怎么做

微信报名系统是一种基于微信公众号或小程序的开发和应用&#xff0c;可实现用户通过微信进行在线报名、支付等操作的系统。本文将介绍微信报名系统的基本概念、制作流程、功能特点、使用流程和推广策略&#xff0c;帮助读者了解如何制作一个高效的微信报名系统。 一、微信报名系…

从零开始学习调用百度地图网页API:三、鼠标点击绘图功能

目录 代码功能问题注意addEventListenerplot_line 代码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name"viewport" content"initial-scale1.0,…

WordPress 常规设置页面调用媒体中心上传图片插入URL(新版可用)

首先&#xff0c;我们需要在主题或插件文件夹中创建一个 JavaScript 文件&#xff08;如&#xff1a;media-uploader.js&#xff09;&#xff0c;该文件中包含如下代码。 /*** 媒体中心上传 js **/ jQuery(document).ready(function($){var mediaUploader;$(#upload_image_but…

AUTOSAR介绍

AUTOSAR产生背景 车辆功能的创新导致车辆E/E架构日益复杂。与此同时&#xff0c;开发要求通常自相矛盾&#xff1a;例如要求驾驶域辅助系统支持关键性驾驶操控&#xff0c;提高燃油经济性同时符合环境标准。信息娱乐和通信系统与实时车辆环境和在线服务的不断深入整合带来了更…

MASA MAUI 预览Office文件

文章目录 背景介绍1、新建MAUI Blazor项目2、创建OfficeViewer.razor组件3、使用安卓模拟器运行4、兼容iOS 总结 背景 接到一个在Maui中预览Office文件的需求&#xff0c;包含excel、word、PDF三种常见的文件&#xff0c;经过技术选型&#xff0c;最后选择了微软原生支持的off…

如何避免输入中文拼音时触发input事件

如何避免输入中文拼音时触发 input 事件 html 结构 <input type"text" name"" id"" />js 定义了一个输入框并添加了三个事件监听器。以下是每个部分的解释&#xff1a; const input document.querySelector("input"); let i…