关于 vue3 axios的封装,并发请求相关
简介
Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。
请求方法别名
为了方便起见,axios为所有支持的请求方法提供了别名(配置项在这里就不多做介绍,官网都有axios):
axios(config)
axios.request(config)
axios.get(url [,config])
axios.post(url [,data [,config]])
axios.put(url [,data [,config]])
axios.delete(url [,config])
axios.patch(url [,data [,config]])
axios.head(url [,config])
封装之前,需要下载axios依赖,这些准备工作做好后才能进行以下操作。
一,首先创建utils目录,在该目录下创建index.ts 文件,我这里用的是ts封装。
// 引入axios插件
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
// import { ElMessage } from 'element-plus'// 使用create 创建axios示例 (当然这里存在很多配置选项,具体需要具体配置)
const instance = axios.create()
// 我在这里直接指定了post请求的 请求类型 Content-Type, 可不设置看需要
instance.defaults.headers.post['Content-Type'] = 'application/json; charset=UTF-8'// 声明一个数组用于存储每个ajax请求的取消函数和ajax标识
const pending: any = []
const { CancelToken } = axios // axios 内置方法,此方法是为取消请求// 入参removeAll 为true时,清空数组。
const removePending = (ever: AxiosRequestConfig, removeAll?: boolean) => {for (let i = 0; i < pending.length; i += 1) {if (removeAll) {pending[i].f() // 执行取消操作pending.splice(i, 1) // 把这条记录从数组中移除} else if (pending[i].u === `${ever.url!.replace(/d=\d+/, '')}&${ever.method}`) {// 当当前请求在数组中存在时执行函数体pending[i].f() // 执行取消操作pending.splice(i, 1) // 把这条记录从数组中移除}}
}const removeOtherPending = (ever: string, removeAll?: boolean) => {for (let i = 0; i < pending.length; i += 1) {if (pending[i].u.indexOf(ever) !== -1) {// 当当前请求在数组中存在时执行函数体pending[i].f() // 执行取消操作pending.splice(i, 1) // 把这条记录从数组中移除}}
}// http request 拦截器
instance.interceptors.request.use((config: AxiosRequestConfig) => {// canMoreActive 参数用来判断是否需要被添加到pending队列中 该参数是设置在请求头中的,需要后台进行配置该参数if (!config.headers!.canMoreActive) {// 该接口是否可以多并发removePending(config) // 在一个ajax发送前执行一下取消操作// eslint-disable-next-line no-param-reassignconfig.cancelToken = new CancelToken((c) => {// 这里的ajax标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式pending.push({// 去除添加的日期导致的链接不一致u: `${config.url!.replace(/d=\d+/, '')}&${config.method}`,f: c,})})}return config},(error: AxiosError) => Promise.reject(error)
)// 必须在项目中重写该方法,因为如果调用多次use方法,是一个队列,函数都会执行
/* instance.interceptors.response.use((response: AxiosResponse) => {removePending(response.config) // 在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除if (response.data.code === 700) {ElMessage({type: 'error',message: response.data.msg,})}return response},(error: AxiosError) => Promise.reject(error)
) *//*** 封装get方法* @param url 请求url* @param params 参数* @param config config参数* @returns {Promise}*/
function fetch(url: string,params: any = {},config = {headers: {},}
): Promise<any> {return new Promise((resolve, reject) => {// 参数增加一个随机数解决浏览器缓存问题instance.get(`${url}?d=${new Date().getTime()}`, {params,headers: config.headers, // 设置get请求头,用来传递canMoreActive参数}).then((response) => {if (response) {resolve(response.data)}}).catch((err) => {reject(err)})})
}/*** 封装post请求* @param url 请求url* @param data 参数* @param config config参数* @returns {Promise}*/
function post(url: string,params: any = {},config = {},ContentType = ''
): Promise<any> {return new Promise((resolve, reject) => {if (ContentType) {instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'} else {instance.defaults.headers.post['Content-Type'] = 'application/json; charset=UTF-8'}instance.post(url, params, config).then((response) => {if (response) {resolve(response.data)}}).catch((err) => {reject(err)})})
}/*** 封装 DELETE 请求* @param {string} url 请求的URL* @param {object} data 请求参数* @param {object} config 额外的 Axios 请求配置* @returns {Promise<any>}*/
function del(url: string,data: any = {},config: AxiosRequestConfig = {}
): Promise<any> {return new Promise((resolve, reject) => {// 发起 DELETE 请求// 使用 delete 方法,注意要传递参数在 data 属性中instance.delete(url, {...config, data}).then((response: AxiosResponse) => {resolve(response.data) // 解析响应数据}).catch((error: AxiosError) => {reject(error) // 处理请求错误})})
}// 全部导出
export { instance, post, fetch, pending, del, removePending, removeOtherPending }
以上大致封装完毕,导出相关用法。
二,在你项目结构中所适用的位置创建 index.ts 文件,我是在apis 目录下创建的。
// 引入上文index.ts 文件 可以决定路径,也可@/...(@代表src下)。
import {instance, removePending, post, fetch, del, pending,} from '这里是你上个文件创建的位置'
import { ElMessage } from 'element-plus'
// ts中 axios 类型
import { AxiosResponse, AxiosError } from 'axios'
// 这里是在外部文件 处理的baseUrl 基准地址,你也可以在上文中就约定好,一般基准地址都是动态的,不手动修改的
import * as base from './base'
import router from '@/router'const instanceInit = () => {// 在这设置了基准地址 instance.defaults.baseURL = base.baseURL//instance.interceptors.response.use((response: AxiosResponse) => {removePending(response.config) // 在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除if (response.data.code === 401 || response.data.code === '401') {ElMessage({type: 'warning',message: response.data.msg || '登录信息已过期,请重新登录!',})router.replace({path: '/login'})return Promise.reject()}return response},(error: AxiosError) => {// 当前接口不需要提示if (!error.config?.params?.noWarning) {ElMessage({type: 'warning',message: '系统错误,请联系管理员!',})}return Promise.reject(error)})
}export { instanceInit, instance, removePending, post, del, fetch, pending }
三,在 main.ts 中引入:
// 引入 上文声明 instanceInit 方法
import { instanceInit } from './apis/index'instanceInit()
以上就是完整封装的axios, 里面包含注释。 如要登录后设置 请求头token, 可直接在拿到token后直接设置。
import { instance } from '@/apis/index'instance.defaults.headers.common.Authorization = '你的token'
四,下面来看一下使用示例:
首先可以分业务类型,功能模块去区分各个不同文件。在此就创建一个 equipment.ts 文件。文件中定义不同路径请求的api。可直接在 组件中引入使用。
// 引入封装好的 get post 请求
import { fetch, post } from './index'export const updateSuspectNoItemYet = {r: (params: any) => fetch('/suspect/updateSuspectNoItemYet', params),
}export const listGoodsPage = {r: (params: any) => post('/goods/listGoodsPage', params, {headers: {// 这里设置 canMoreActive 说明该接口api 是可以并发的,多次请求。(也可在此配置 axios官网 所说的配置项 // eg: headers: { Authorization: 'Bearer 123' })canMoreActive: 'canMoreActive',// Authorization: 'Bearer 123'},}),
}// 组件中 使用
import { listGoodsPage, updateSuspectNoItemYet } from '@/apis/equipment'const getList = async () => {// params 入参 {id:'1',name: '测试'}const res = await listGoodsPage.r(params)
}
以上就是完整的示例,欢迎评论区讨论,如有写的不足的地方欢迎指出。感谢点赞,收藏!
相关文章:
关于 vue3 axios的封装,并发请求相关
简介 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 请求方法别名 为了方便起见&#x…...
cpp中的namespace详解
namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性,它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说,它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…...
request库的使用 | get请求
requests 库的 get 方法用于发送 HTTP GET 请求。GET 请求通常用于请求服务器发送数据。 1、导入 requests 库: import requests 2、发送 GET 请求: 使用 requests.get() 方法发送请求。 response requests.get(urlhttp://www.jd.com) 3、查看响应…...
理想低通信道和理想带通信道的区别
一、定义与特性 理想低通信道(可通过<MAX): 定义:理想低通信道允许信号的所有低频分量,只要其频率不超过某个上限值,都能够不失真地通过此信道。而频率超过该上限值的所有高频分量都不能通过该信道。特…...
LAMP架构搭建
目录 LAMP架构搭建 编译安装Apache httpd服务 1、需要的安装包 2、关闭防火墙和核心防护 3、安装环境依赖包 4、配置软件模块 5、编译及安装 6、优化配置文件路径(可不做) 7、添加httpd系统服务 8、修改httpd 服务配置文件 9、浏览器访问验证…...
RT-DETR
SSE represents the single-scale Transformer encoder,CSF represents cross-scale fusion. AIFI and CCFF are the two modules designed into 作者的 hybrid encoder 截止到发文时间的issue数,多吓人呐,不建议复现...
【算法——KMP】
1理解next数组定义:最长相等前后缀(不含当前字符并且不能是整体) 算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili next数组的值:假设这个i出现了不匹配就从next[i]的位置开始在再匹配 2next数组生成 看一下是怎…...
视频监控相关笔记
一、QT 之 QTreeWidget 树形控件 Qt编程指南,Qt新手教程,Qt Programming Guide 一个树形结构的节点中的图表文本 、附带数据的添加: QTreeWidgetItem* TourTreeWnd::InsertNode(NetNodeInfo node, QTreeWidgetItem* parent_item) { // …...
React 中,构建组件的方式
1. 函数组件(Function Components) 函数组件是最简单的组件形式,通常用于展示性的组件,不涉及复杂的生命周期方法。 import React from react;function Welcome(props) {return <h1>Hello, {props.name}</h1>; }exp…...
Android开发高频面试题之——Android篇
Android开发高频面试题之——Android篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Activity启动模式 standard 标准模式,每次都是新建Activity实例。singleTop 栈顶复用。如果要启动的A…...
禁用拷贝构造函数和赋值构造函数
在C中,禁用拷贝构造函数和拷贝赋值操作符的方式通常是为了防止类的对象被意外复制,这对于那些管理独占资源或不应被复制的对象尤为重要。 class LatActiveControlState : public LatState { public:LatActiveControlState() : LatState(LatS_ActiveCont…...
OneDrive for Business with Office Online 部署方案
目录 前言 部署准备 需求分析 用户需求 技术需求 环境准备 硬件要求 软件要求 许可计划 OneDrive for Business 部署 前期准备 域名配置 Azure AD 配置 安装与配置 安装 OneDrive 同步客户端 配置 OneDrive 组策略 数据迁移 Office Online 部署 前期准备 安…...
win10 win11 设置文件权限以解决Onedrive不能同步问题
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Unity DOTS系列之IJobChunk来迭代处理数据
最近DOTS发布了正式的版本, 我们来分享一下System中如何在System中使用IJobChunk来迭代处理World中的数据,方便大家上手学习掌握Unity DOTS开发。 再回顾一次基于ArcheType Chunk内存管理 我们先再次回顾以下基于ArcheType的Chunk内存管理。每一类Entity都是由一些…...
哈希——哈希表
回顾/本期梗概 上期我们学习了哈希——字符串哈希(空降链接),本期我们将学习哈希中的哈希表。 1、哈希表原理 (1)使用数组下标直接标记元素 哈希表(也叫数列表):是一种高效的、通过把…...
简单了解 JVM
目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。 虚拟机是指通过软件模…...
已经30岁了,想转行从头开始现实吗?什么样的工作算好工作?
我是29岁那年,完成从转行裸辞副业的职业转型。 如果你把职业生涯看成是从现在开始30岁,到你退休那年,中间这么漫长的30年,那么30岁转行完全来得及; 如果你觉得必须在什么年纪,什么时间内必须完成赚到几十…...
快速理解docker(一)docker 简介
在当今快速迭代的软件开发环境中,如何高效地部署、管理和扩展应用程序成为了开发者们面临的重大挑战。Docker,作为一款开源的容器化平台,凭借其轻量级、可移植性和易于部署的特性,迅速成为了解决这些挑战的热门选择。本文将带您走…...
RHCS认证-Linux(RHel9)-Ansible
文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附:安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible,ansible-navigator7.2 部署ansibl…...
【Python】Spyder:科学 Python 开发环境
在数据科学和科学计算领域,Python 已经成为了一个不可或缺的工具。为了提高开发效率和改善编程体验,一个功能强大且用户友好的开发环境是必需的。Spyder(Scientific Python Development Environment)正是这样一个为科学计算和数据…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...
基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...
持续交付的进化:从DevOps到AI驱动的IT新动能
文章目录 一、持续交付的本质:从手动到自动的交付飞跃关键特性案例:电商平台的高效部署 二、持续交付的演进:从CI到AI驱动的未来发展历程 中国…...
npm install 相关命令
npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖(默认&…...
2025-06-01-Hive 技术及应用介绍
Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力…...
