前端如何处理「并发」问题?

news2024/11/28 12:55:40

🐱 个人主页:不叫猫先生,公众号:前端舵手
🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫优质专栏:vue3+vite+typeScript从入门到实践
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼(文末有我wx或者私信)。

在这里插入图片描述

在项目中我们会遇到一次请求多个接口,当所有请求结束后进行操作,也会遇到多个请求(大量)同时进行请求资源,本文就并发问题通过axios对这两种现象进行优化处理,主要通过 axios中all、spread、请求拦截以及响应拦截进行处理。

axios中all、spread

axiosallspread都是axios的静态方法,可以直接通过axios对象调用。

  • all:用于并发控制,接收一个包含多个Promsie对象的数组,多个Promsie也就是多个请求。最终返回一个Promise,这个Promise只有当所有的请求结束后才会被解析。
  • spread:用于处理多个并发请求的结果。接收一个回调函数作为参数,并将每个请求的结果作为独立的参数传递给回调函数。
const foo = () => {
  return  axios.get("https://dog.ceo/api/breeds/image/random ")
}  

const bar = () => {
  return  axios.get("https://dog.ceo/api/breeds/list/all")
     
};
axios.all([foo(), bar()]).then(
    axios.spread( (acct, perms) =>{
        console.log(acct,'acct');
        console.log(perms,'perms');
    })
);

定义的foobar必须要把axios的请求return,这样得到的才是一个Promise对象。结果如下:

在这里插入图片描述

axios请求拦截、响应拦截

声明三个变量:请求队列、最大并发请求数、当前并发请求数

const requestQueue = []; // 请求队列
const maxConcurrent = 3; // 最大并发请求数
let concurrentRequests = 0; // 当前并发请求数

在请求拦截中,如果当前并发请求数没超过最大并发请求数,当前并发请求数就加1,否则就将请求添加到请求队列中,其中config是当前请求的配置,resolve是解析函数。

//请求拦截设置
import axios from "axios";
axios.interceptors.request.use(
    (config) => {
      console.log(config,'concurrentRequests')
        if (concurrentRequests < maxConcurrent) {
            console.log('000000')
            // 如果并发请求数量小于最大并发数,直接发送请求
            concurrentRequests++;
            return config;
        } else {
            // 如果并发请求数量达到最大并发数,将请求添加到队列中
            return new Promise((resolve) => {
                console.log('333333')
                requestQueue.push({
                    config,
                    resolve,
                });
            });
        }
    },
    (error) => {
        return Promise.reject(error);
    }
);

在这里插入图片描述

打印结果如下:

在这里插入图片描述

在响应拦截中,并发请求数量减1,如果请求队列的长度大于0,说明有等待的请求,通过shift取出队列中的最早的请求,同时在请求队列中删除该请求。然后当前并发请求数加1,通过resolve(config)触发解析函数发送请求。当调用解析函数时,相当于将 Promise 的状态从待定(pending)转变为已解析(resolved),并将传递的参数作为解析值。失败的话并发请求数量减1,抛出异常。

//响应拦截
axios.interceptors.response.use(
    (response) => {
        concurrentRequests--; // 并发请求数量减2
        if (requestQueue.length > 0) {
            // 如果请求队列中有等待的请求,发送下一个请求
            const { config, resolve } = requestQueue.shift();
            concurrentRequests++;
            resolve(config);
        }
        return response.data;
    },
    (error) => {
        concurrentRequests--; // 并发请求数量减一
        return Promise.reject(error);
    }
);

这里模仿了10个请求进行测试,具体如下:

// 发送请求
for (let i = 0; i < 10; i++) {
  axios
    .get("https://dog.ceo/api/breeds/image/random")
    .then((response) => {
      // 处理响应
      console.log(response.data);
    })
    .catch((error) => {
      // 处理错误
      console.error(error);
    });
}

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

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

相关文章

Avalon 学习系列(四)—— 循环遍历

Avalon2 的 ms-for 绑定集齐了 ms-repeat, ms-each, ms-with 的所有功能&#xff0c; 更加好用&#xff0c; 性能也提升了很多。 Avalon 不需要 vue 或 react 那样使用 key 属性来提高性能&#xff0c;内部已经帮你搞定了。 循环数组 ms-for 循环数组示例&#xff1a; <…

运维圣经:勒索病毒应急响应指南

目录 勒索病毒简介 常见勒索病毒种类 WannaCry Globelmposter Crysis/ Dharma 攻击特点 应急响应方法指南 一. 隔离被感染的服务器/主机 二. 排查业务系统 三. 确定勒索病毒种类&#xff0c; 进行溯源分析 四. 恢复数据和业务 五. 清理加固 病毒清理及加固 感染文…

零基础也能懂的python办公自动化教程,从此上班摸鱼轻轻松松

前言 如今Python在自动化办公领域的表现越来越亮眼&#xff0c;受到了很多非IT的职场人士的推崇&#xff0c;也引得更多的人去了解、学习Python。但是很多初学者都会面临这么一个困惑&#xff1a;想把Python应用在工作中&#xff0c;却不知从何下手&#xff01;&#xff08;资…

【音视频处理】音频编码AAC详解,低码率提高音质?

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们介绍音频编码格式AAC。 AAC是音频最常用的编码格式之一&#xff0c;几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的&#xff0c;只是某些细节存在差别&#xff0c;如压缩算法、某些音频参数存在限制…

6个ChatGPT4的最佳用途

文章目录 ChatGPT 4’s Current Limitations ChatGPT 4 的当前限制1. Crafting Complex Prompts 制作复杂的提示2. Logic Problems 逻辑问题3. Verifying GPT 3.5 Text 验证 GPT 3.5 文本4. Complex Coding 复杂编码5.Nuanced Text Transformation 细微的文本转换6. Complex Kn…

100天精通Golang(基础入门篇)——第8天:Go语言程序的流程结构和条件语句

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

【Unity入门】25.零基础实现游戏Demo--神鸟大战怪兽

【Unity入门】零基础实现游戏Demo--神鸟大战怪兽 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 (一) 前言 经过了两个月的学习&#xff0c;我们也顺利的完成了入门课程&#xff0c;最后就用一个Demo作为我们的结课句…

动态规划算法(子序列专题1)

动态规划算法专辑之子序列问题&#xff08;1&#xff09; 本专栏将从状态定义、状态转移方程、初始化、填表顺序、返回值这五大细节来详细讲述动态规划的算法的解题思路及代码实现 一、什么是子序列 子数列&#xff0c;又称子序列&#xff0c;在数学中&#xff0c;某个序列的…

工时表:如何跟踪团队进度?

工时表可以记录考勤&#xff0c;但你知道它还能帮助你管理项目和监控团队绩效吗&#xff1f;在本文中&#xff0c;了解如何将在线时间跟踪与你的日常工作流程相结合&#xff0c;以调整你的团队并提高灵活性。 在线时间追踪与手动 传统上&#xff0c;工时表在每天或每周开始时…

基于Java企业办公自动化系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

【干货分享】安卓加固原理分享

之前写过几篇ios加固的文章&#xff0c;感兴趣可以看一下。最近攒了一下收集的一些资料&#xff0c;打算简单写一下安卓加固相关的内容。今天先简单写一篇安卓加固原理的分享。 App会面临的风险 我们首先了解一下为什么需要加固&#xff0c;尤其是安卓APP&#xff0c;下面是A…

【网络攻击】面对网络攻击,我们该如何防范?

网络攻击手段的种类繁多&#xff0c;其中主要攻击手段的有钓鱼网站、恶意软件社交媒体欺诈等。在这篇文章中&#xff0c;我们将探讨这些攻击方式&#xff0c;并提供几种有效的防范方法。 一、钓鱼网站 钓鱼网站是一种欺诈行为&#xff0c;攻击者以虚假的方式获取用户的个人信息…

FPC的发展及应用,软板行业未来将持续增长

FPC系列文章目录 1.什么是FPC 2.什么是R-FPC 3&#xff0c;FPC的基材 4.FPC基材压延铜和电解铜的区别 5&#xff0c;FPC的辅材 6&#xff0c;FPC常见的四种类型 7&#xff0c;FPC的生产流程简介 8&#xff0c;R-FPC的生产流程简介 9&#xff0c;FPC的发展及应用 提示&…

【LLM GPT】大型语言模型 理解和实现

目录 1 概述1.1 发展历程1.2 预训练监督学习预训练的好处 1.3 增强式学习1.4 对训练数据的记忆1.5 更新参数1.6 AI内容检测1.7 保护隐私 1 概述 怎么学习&#xff1f;——给定输入和输出&#xff1a; 但是这样做不现实&#xff0c;因为这样输入-输出需要成对的资料&#xff0…

SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据

SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据 更多优秀文章&#xff0c;请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 一、背景&#xff1a; 利用ThreadPoolTaskExecutor多线程异步批量插入&#xff0c;提高百万级数据插入效率。ThreadPoolTaskExecut…

AI+低代码:开发革命的崭新纪元!带你一文速通了解

信息技术、通信技术和计算能力的迅速发展&#xff0c;AI技术在诸多领域中掀起了一股革命浪潮&#xff0c;成为推动社会进步和发展的重要力量&#xff0c;也是许多国家和企业日益重视和投资的方向。 而全球化和技术革新的深入推进&#xff0c;传统产业对劳动力的需求逐渐减少&am…

阿里飞猪三面

&#xff08;有许多人是用青春的幸福作成功的代价的。——莫扎特&#xff09; 背景 该岗位是阿里飞猪的前端部门&#xff0c;岗位名称是node.js高级/专家开发工程师。主要负责用NodeJs作为后端技术&#xff0c;向上层Java&#xff0c;Node等业务服务&#xff0c;提供中间层基础…

操作教程:如何正确配置让EasyNVR级联至EasyNVS平台?

EasyNVS是EasyNVR的云管理平台&#xff0c;可实现内网监控上云&#xff0c;视频汇聚等功能。近期经常有用户咨询EasyNVR如何级联至EasyNVS平台进行云端统计和管理&#xff0c;在今天的文章中&#xff0c;我们来详细介绍一下。 1、配置EasyNVS 1&#xff09;运行EasyNVS之前&a…

Quarkus - 发布JSON Restful服务

目标 基于实现第一个Hello World发布一个JSON的Restful服务&#xff0c;该服务提供GET,POST,DELETE三个接口&#xff0c;分别是获取水果列表&#xff0c;添加水果&#xff0c;根据水果名字删除水果。 发布Rest服务 POM配置 添加jackson扩展的依赖 <dependency><gr…

Oralce系列十八:Oracle RAC

Oracle RAC 1. Oracle RAC介绍1.1 基本概念1.2 Oracle RAC应用场景1.3 Oracle RAC的优缺点 2. Oracle RAC架构3. Oracle RAC 的安装 1. Oracle RAC介绍 1.1 基本概念 Oracle RAC&#xff08;Oracle Real Application Server Cluster&#xff09;是一种分布式数据库解决方案&a…