关于 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)正是这样一个为科学计算和数据…...
Qwen3-14B企业知识沉淀:会议录音转写+关键结论自动提炼
Qwen3-14B企业知识沉淀:会议录音转写关键结论自动提炼 1. 企业知识管理的痛点与解决方案 在日常工作中,会议是信息交流的重要场景,但会议录音的整理工作往往耗时费力。传统的人工转写方式存在几个明显问题: 效率低下࿱…...
从按键消抖到外部中断:STM32 GPIO输入模式的‘避坑’指南与AFIO的隐藏用法
从按键消抖到外部中断:STM32 GPIO输入模式的‘避坑’指南与AFIO的隐藏用法 在嵌入式开发中,GPIO(通用输入输出)接口是与外部世界交互的第一道门槛。对于STM32开发者来说,GPIO配置看似简单,却暗藏诸多细节陷…...
LiuJuan20260223Zimage开箱体验:基于Z-Image LoRA,这个专精模型到底有多好用?
LiuJuan20260223Zimage开箱体验:基于Z-Image LoRA,这个专精模型到底有多好用? 你有没有遇到过这样的情况:想用AI画一个特定的人物,比如你故事里的主角,或者一个IP形象,但生成的图片要么不像&am…...
Wan2.2-T2V-A5B实战:GitHub版本管理下的团队协作开发流程
Wan2.2-T2V-A5B实战:GitHub版本管理下的团队协作开发流程 你是不是也遇到过这样的场景?团队几个人一起开发一个基于Wan2.2-T2V-A5B的应用项目,代码改来改去,最后谁改了哪部分、为什么改、线上版本和本地版本哪个更新,…...
Wan2.2-I2V-A14B效果展示:复杂提示词‘雨夜霓虹街道行人撑伞行走’生成效果
Wan2.2-I2V-A14B效果展示:复杂提示词雨夜霓虹街道行人撑伞行走生成效果 1. 模型能力概览 Wan2.2-I2V-A14B是一款专为高质量视频生成设计的先进模型,能够将文字描述转化为生动的动态画面。这款模型特别擅长处理复杂场景和细腻氛围的渲染,在以…...
C-index避坑指南:生存分析中90%人会犯的5个评估错误
C-index避坑指南:生存分析中90%人会犯的5个评估错误 在临床研究和生物统计领域,C-index(Harrells concordance index)作为评估生存分析模型预测性能的核心指标,其正确计算与解读直接影响研究结论的可靠性。然而&#x…...
Qwen3-TTS开源大模型实战:复古HUD界面下的AI语音创作工作流
Qwen3-TTS开源大模型实战:复古HUD界面下的AI语音创作工作流 1. 引言:当AI语音合成遇上复古游戏风 想象一下,你不再需要面对枯燥的音频参数调节界面,而是走进一个像素风的游戏世界。在这里,生成一段AI语音就像玩一款复…...
智能表格在敏捷项目管理中的工时统计实践
1. 为什么敏捷团队需要智能工时统计 在敏捷开发中,两周一次的迭代就像一场短跑比赛。我见过太多团队在冲刺过半时才发现工时严重超支,这时候再调整已经来不及了。传统Excel表格需要手动更新公式,光是合并不同成员的工作量报表就能消耗半天时间…...
嵌入式Linux C++开发框架AppKit实战解析
1. 嵌入式Linux C开发框架AppKit深度解析在嵌入式Linux开发领域,C开发者经常面临一个尴尬局面:标准库功能有限,而ROS等框架又过于庞大。AppKit框架正是为解决这一痛点而生,它提供了恰到好处的中间层抽象。我在多个工业控制项目中实…...
DDD难落地?就让AI干吧! - cleanddd-skills介绍
一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...
