关于 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)正是这样一个为科学计算和数据…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...