当前位置: 首页 > news >正文

关于 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 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 请求方法别名 为了方便起见&#x…...

cpp中的namespace详解

namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性&#xff0c;它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说&#xff0c;它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…...

request库的使用 | get请求

requests 库的 get 方法用于发送 HTTP GET 请求。GET 请求通常用于请求服务器发送数据。 1、导入 requests 库&#xff1a; import requests 2、发送 GET 请求&#xff1a; 使用 requests.get() 方法发送请求。 response requests.get(urlhttp://www.jd.com) 3、查看响应…...

理想低通信道和理想带通信道的区别

一、定义与特性 理想低通信道&#xff08;可通过<MAX&#xff09;&#xff1a; 定义&#xff1a;理想低通信道允许信号的所有低频分量&#xff0c;只要其频率不超过某个上限值&#xff0c;都能够不失真地通过此信道。而频率超过该上限值的所有高频分量都不能通过该信道。特…...

LAMP架构搭建

目录 LAMP架构搭建 编译安装Apache httpd服务 1、需要的安装包 2、关闭防火墙和核心防护 3、安装环境依赖包 4、配置软件模块 5、编译及安装 6、优化配置文件路径&#xff08;可不做&#xff09; 7、添加httpd系统服务 8、修改httpd 服务配置文件 9、浏览器访问验证…...

RT-DETR

SSE represents the single-scale Transformer encoder&#xff0c;CSF represents cross-scale fusion. AIFI and CCFF are the two modules designed into 作者的 hybrid encoder 截止到发文时间的issue数&#xff0c;多吓人呐&#xff0c;不建议复现...

【算法——KMP】

1理解next数组定义&#xff1a;最长相等前后缀&#xff08;不含当前字符并且不能是整体&#xff09; 算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili next数组的值&#xff1a;假设这个i出现了不匹配就从next[i]的位置开始在再匹配 2next数组生成 看一下是怎…...

视频监控相关笔记

一、QT 之 QTreeWidget 树形控件 Qt编程指南&#xff0c;Qt新手教程&#xff0c;Qt Programming Guide 一个树形结构的节点中的图表文本 、附带数据的添加&#xff1a; QTreeWidgetItem* TourTreeWnd::InsertNode(NetNodeInfo node, QTreeWidgetItem* parent_item) { // …...

React 中,构建组件的方式

1. 函数组件&#xff08;Function Components&#xff09; 函数组件是最简单的组件形式&#xff0c;通常用于展示性的组件&#xff0c;不涉及复杂的生命周期方法。 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中&#xff0c;禁用拷贝构造函数和拷贝赋值操作符的方式通常是为了防止类的对象被意外复制&#xff0c;这对于那些管理独占资源或不应被复制的对象尤为重要。 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&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

Unity DOTS系列之IJobChunk来迭代处理数据

最近DOTS发布了正式的版本, 我们来分享一下System中如何在System中使用IJobChunk来迭代处理World中的数据&#xff0c;方便大家上手学习掌握Unity DOTS开发。 再回顾一次基于ArcheType Chunk内存管理 我们先再次回顾以下基于ArcheType的Chunk内存管理。每一类Entity都是由一些…...

哈希——哈希表

回顾/本期梗概 上期我们学习了哈希——字符串哈希&#xff08;空降链接&#xff09;&#xff0c;本期我们将学习哈希中的哈希表。 1、哈希表原理 &#xff08;1&#xff09;使用数组下标直接标记元素 哈希表&#xff08;也叫数列表&#xff09;&#xff1a;是一种高效的、通过把…...

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模…...

已经30岁了,想转行从头开始现实吗?什么样的工作算好工作?

我是29岁那年&#xff0c;完成从转行裸辞副业的职业转型。 如果你把职业生涯看成是从现在开始30岁&#xff0c;到你退休那年&#xff0c;中间这么漫长的30年&#xff0c;那么30岁转行完全来得及&#xff1b; 如果你觉得必须在什么年纪&#xff0c;什么时间内必须完成赚到几十…...

快速理解docker(一)docker 简介

在当今快速迭代的软件开发环境中&#xff0c;如何高效地部署、管理和扩展应用程序成为了开发者们面临的重大挑战。Docker&#xff0c;作为一款开源的容器化平台&#xff0c;凭借其轻量级、可移植性和易于部署的特性&#xff0c;迅速成为了解决这些挑战的热门选择。本文将带您走…...

RHCS认证-Linux(RHel9)-Ansible

文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附&#xff1a;安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible&#xff0c;ansible-navigator7.2 部署ansibl…...

【Python】Spyder:科学 Python 开发环境

在数据科学和科学计算领域&#xff0c;Python 已经成为了一个不可或缺的工具。为了提高开发效率和改善编程体验&#xff0c;一个功能强大且用户友好的开发环境是必需的。Spyder&#xff08;Scientific Python Development Environment&#xff09;正是这样一个为科学计算和数据…...

SpringBootWeb响应

2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09; 那么Controller程序呢&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了…...

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台...

虚拟机centos_7 配置教程(镜像源、配置centos、静态ip地址、Finalshell远程操控使用)

文章目录 一、下载镜像源&#xff08;准备工作&#xff09;1、开源网站2、下载 二、VMware配置centos三、配置静态IP地址四、Finalshell使用1、下载Finalshell2、连接虚拟机 五、谢谢观看&#xff01; 一、下载镜像源&#xff08;准备工作&#xff09; 1、开源网站 有许多开源…...

git 删除 git push 失败的记录

文章目录 问题分析 问题 git push 失败后如何清理 commit 提交的内容 当我们 git push 失败后&#xff0c;如果下次有新的改动需要push时&#xff0c;会出现如下报错 分析 找到需要回退的那次commit的 哈希值 git log然后就回退到了指定版本&#xff0c;这个时候再把新修改…...

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…...

哪款品牌充电宝性价比比较高?五款性价比绝佳充电宝推荐

在现代生活中&#xff0c;充电宝已经成为我们日常出行和工作的必备品。然而&#xff0c;面对市场上琳琅满目的充电宝品牌&#xff0c;大家往往难以抉择。尤其是在近期&#xff0c;充电宝不合格产品的数量持续上升&#xff0c;据最新抽查结果显示&#xff0c;不合格率已经上升到…...

巨坑!!华为大数据平台sparksql,连接gauss200数据库

最近用华为大数据平台fusion6.5平台&#xff0c;写了一个sparksql 读取gauss200的MPP数据库的程序。 首先将spark 相关的jar依赖包&#xff0c;必须在华为大数据平台的客户端的spark/jars 这个文件里面去找到然后添加到idea 依赖里面。打包要把整体包打在里面。 核心代码片段…...

BGP相关知识笔记

技术背景&#xff1a; 在只有IGP&#xff08;诸如OSPF、IS-IS、RIP等协议&#xff0c;因为最初是被设计在一个单域中进行一个路由操纵&#xff0c;因此被统一称为Interior Gateway Protocol&#xff0c;内部网关协议&#xff09;的时代&#xff0c;域间路由无法实现一个全局路由…...

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS’ 错误 在 Windows 系统上启动 Vue 项目时&#xff0c;遭遇报错。具体报错信息如下&#xff1a; ‘NODE_OPTIONS‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。这个错误通常意味着 Windows 系统无法识…...

面试真题:谈一谈Mysql的分库分表

分表和分库是什么&#xff1f;有什么区别&#xff1f; 分库是一种水平扩展数据库的技术&#xff0c;将数据根据一定规则划分到多个独立的数据库中。每个数据库只负责存储部分数据&#xff0c;实现了数据的拆分和分布式存储。分库主要是为了解决并发连接过多&#xff0c;单机 my…...