axios 全局错误处理和请求取消

这两个功能都是用拦截器实现。
前景提要:
ts 简易封装 axios,统一 API
实现在 config 中配置开关拦截器
全局错误处理
在构造函数中,添加一个响应拦截器即可。在构造函数中注册拦截器的好处是,无论怎么实例化封装类,这个错误拦截器都会被注册进实例。
其中有个注意点,就是请求取消。取消请求会导致响应 promise 状态为 rejected,这样就会触发响应拦截器的 onRejected 回调。因此要单独处理请求的请求情况,将它与请求错误区分开来。
class HttpRequest {private readonly instance: AxiosInstance;constructor(config: MyAxiosRequestConfig) {this.instance = axios.create(config);// axios http 错误处理(超出 2xx 范围的 http 状态码都会触发该函数)this.instance.interceptors.response.use(null, (error: AxiosError) => {// 手动取消请求会导致“错误”触发if (error.message === "canceled") alert("请求取消成功");const { response } = error;// 1. 请求超时 && 网络错误单独判断,因为没有 responseif (error.message.indexOf("timeout") !== -1) alert("请求超时!请您稍后重试");if (error.message.indexOf("Network Error") !== -1) alert("网络错误!请您稍后重试");// 2. 根据 http 服务器响应的错误状态码,做不同的处理if (response) {switch (response.status) {case 404:alert("你所访问的资源不存在!");break;case 500:alert("服务异常!");break;default:alert("请求失败!");}}// 3. 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:也可以跳转到断网页面if (!window.navigator.onLine) alert("服务器错误或者无网络"); // router.replace("/500");throw error;});}
}
取消请求
axios 取消请求的方式
axios 取消请求有两种 api。一种是 AbortController,一种是古老的 CancelToken ,已经被弃用了。
AbortController - Web API 接口参考 | MDN
我们主要使用第一种方式:
- 实例化取消控制器接口,控制器对象有一个信号标记
signal - 将该标记配置给 axios 同名的
signal配置 - 控制器对象调用
abort()方法就能取消被标记了的请求。
const controller = new AbortController();axios.get('/foo/bar', {signal: controller.signal
}).then(function(response) {//...
});
// 取消请求
controller.abort()
封装取消请求功能
取消请求也是个基础功能,因此和全局错误拦截器一样在构造函数中注册拦截器。
取消请求:
- 为每一个请求生成一个控制器 controller,并添加 signal
- 维护一个 map,以 url 为 key,对应的 controller 为 value
- 要取消哪个请求就通过 url,获取它的 controller 来取消
- 在全局响应拦截器中,给所有请求添加 signal,并在请求结束后从 map 中剔除该 url 对应的 controller
封装类暴露两个方法:
- 取消全部请求
- 根据 url 取消请求
class HttpRequest {private readonly instance: AxiosInstance;private readonly abortControllerMap: Map<string, AbortController>;constructor(config: MyAxiosRequestConfig) {this.instance = axios.create(config);// 为每个请求都生成一个 signal,并以 url 为 key 添加入 mapthis.instance.interceptors.request.use(config => {// 如果具体方法中设置了 signal,这里就不再添加,避免覆盖。if (config.signal) return config;const controller = new AbortController();config.signal = controller.signal;const url = config.url || "";this.abortControllerMap.set(url, controller);return config;},(err: AxiosError) => {throw err;});// 响应完,从map中去除 urlthis.instance.interceptors.response.use(res => {const url = res?.config.url || "";this.abortControllerMap.delete(url);return res;},(err: AxiosError) => {const url = err?.config?.url || "";this.abortControllerMap.delete(url);throw err;});}/*** 取消全部请求*/cancelAllRequest() {for (const [, controller] of this.abortControllerMap) {controller.abort();}this.abortControllerMap.clear();}/*** 取消指定的请求* (并发上传文件的url通常是一样的,通过url取消请求会取消所有上传操作,故此方法不宜用来取消上传请求)* @param url 待取消的请求URL*/cancelRequest(url: string | string[]) {const urlList = Array.isArray(url) ? url : [url];urlList.forEach(_url => {this.abortControllerMap.get(_url)?.abort();this.abortControllerMap.delete(_url);});}
}
相关文章:
axios 全局错误处理和请求取消
这两个功能都是用拦截器实现。 前景提要: ts 简易封装 axios,统一 API 实现在 config 中配置开关拦截器 全局错误处理 在构造函数中,添加一个响应拦截器即可。在构造函数中注册拦截器的好处是,无论怎么实例化封装类,…...
无法加载文件 C:\Program Files\nodejs\cnpm.ps1,因为在此系统上禁止运行脚本。有
cnpm : 无法加载文件 C:\Program Files\nodejs\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Poli cies。 所在位置 行:1 字符: 1 cnpm run debug ~~~~ Categ…...
学电脑编程零基础,计算机编程入门先学什么
学电脑编程零基础,计算机编程入门先学什么,建议先从容易学习的语言入手,比如中文编程。 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件&…...
SQL左连接实战案例
要求:用表df1和表df2的数据,得到df3 一、创建表 CREATE TABLE df1 (姓名 varchar(255) DEFAULT NULL,年龄 int DEFAULT NULL,部门 varchar(255) DEFAULT NULL,id int DEFAULT NULL );CREATE TABLE df2 (部门 varchar(255) DEFAULT NULL,年龄 int DEFAU…...
2、Sentinel基本应用限流规则(2)
2.2.1 是什么 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。 2.2.2 基本概念 • 资源 (需要被保护的东西…...
Qt的事件
2023年11月5日,周日上午 还没写完,不定期更新 目录 事件处理函数的字体特点Qt事件处理的工作原理一些常用的事件处理函数Qt中的事件类型QEvent类的type成员函数可以用来判断事件的类型事件的类型有哪些?有多少种事件类 事件处理函数的字体特…...
MTK联发科天玑9000旗舰5G移动平台处理器_MT6983芯片定制开发
MT6983天玑9000采用台积电4纳米工艺制程,CPU采用“134”三丛集Armv9架构,APU性能提升,ISP处理速度提升,最高支持3.2亿像素摄像头,采用Mali-G710十核GPU,搭载R16 5G调制解调器。 MT6983天玑9000芯片基本概…...
InnoDB中Buffer Pool详解
1. 概念及特点 Buffer Pool 是 MySQL 中 InnoDB 存储引擎用来缓存表数据和索引数据的内存区域。这个内存区域被用来存储磁盘上的数据页的副本,这样常用的数据可以在内存中快速被访问,而不必每次都从磁盘中读取。 以下是 Buffer Pool 的一些重要特点&a…...
3D视觉引导工业机器人上下料,助力汽车制造业实现智能化生产
在工业制造领域,机器人技术一直是推动生产效率和质量提升的重要力量。近年来,随着3D视觉技术的快速发展,工业机器人在处理复杂任务方面迈出了重要的一步。特别是在汽车制造行业,3D视觉引导工业机器人的应用已经取得了令人瞩目的成…...
从Spring说起
一. Spring是什么 在前面的博文中,我们学会了SpringMVC的使用,可以完成一些基本功能的开发了,但是铁子们肯定有很多问题,下面来从Spring开始介绍,第一个问题,什么是Spring? Spring是包含了众多工具方法的IOC容器. Spring有两个核心思想--IOC和AOP,本章先来讲解IOC...... 1.1…...
JavaScript从入门到精通系列第二十九篇:正则表达式初体验
大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻J…...
Go语言并发控制:原理与实践
摘要: 本文将深入探讨Go语言的并发控制机制,包括goroutine、channel和sync等关键概念。我们将通过理论阐述和案例分析,揭示Go语言在并发编程中的优势和挑战,并介绍几种常见的并发控制策略。通过本文的学习,你将掌握Go…...
3、Sentinel 动态限流规则
Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则: • 通过 API 直接修改 (loadRules) • 通过 DataSource 适配不同数据源修改 通过 API 修改比较直观,可以通…...
HDU 2648:Shopping ← STL map
【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid2648【题目描述】 Every girl likes shopping,so does dandelion.Now she finds the shop is increasing the price every day because the Spring Festival is coming .She is fond of a shop which is called "m…...
自己动手实现一个深度学习算法——三、神经网络的学习
文章目录 1.从数据中学习1)数据驱动2)训练数据和测试数据 2.损失函数1)均方误差2)交叉熵误差3)mini-batch学习 3.数值微分1)概念2)数值微分实现 4.梯度1)实现2)梯度法3)梯度法实现4)…...
C++中使用复制构造函数确保深复制
C中使用复制构造函数确保深复制 复制构造函数是一个重载的构造函数,由编写类的程序员提供。每当对象被复制时,编译器都将调用复制构造函数。 为 MyString 类声明复制构造函数的语法如下: class MyString {MyString(const MyString& cop…...
【Mysql】Mysql中表连接的原理
连接简介 在实际工作中,我们需要查询的数据很可能不是放在一张表中,而是需要同时从多张表中获取。下面我们以简单的两张表为例来进行说明。 连接的本质 为方便测试说明,,先创建两个简单的表并给它们填充一点数据: …...
Java配置47-Spring Eureka 未授权访问漏洞修复
文章目录 1. 背景2. 方法2.1 Eureka Server 添加安全组件2.2 Eureka Server 添加参数2.3 重启 Eureka Server2.4 Eureka Server 升级版本2.5 Eureka Client 配置2.6 Eureka Server 添加代码2.7 其他问题 1. 背景 项目组使用的 Spring Boot 比较老,是 1.5.4.RELEASE…...
6.Spark共享变量
概述 共享变量 共享变量的工作原理Broadcast VariableAccumulator 共享变量 共享变量的工作原理 通常,当给 Spark 操作的函数(如 mpa 或 reduce) 在 Spark 集群上执行时,函数中的变量单独的拷贝到各个节点上,函数执行时,使用…...
FaceChain开源虚拟试衣功能,打造更便捷高效的试衣新体验
简介 虚拟试衣这个话题由来已久,电商行业兴起后,就有相关的研发讨论。由其所见即所得的属性,它可以进一步提升用户服装购买体验。它既可以为商家做商品展示服务,也可以为买家做上身体验服务,这让同时具备了 B 和 C 的两…...
Tetrazine-amine HCl salt,CAS:1416711-59-5,四嗪-氨基盐酸盐的描述
Tetrazine-amine HCl salt(四嗪-氨基盐酸盐)是一种结合了四嗪基团和氨基盐酸盐结构的化合物,在化学、生物医药和材料科学等领域具有广泛应用。一、基本信息中文名称:四嗪-氨基盐酸盐英文名称:Tetrazine-amine HCl salt…...
WarcraftHelper:让经典魔兽争霸III在现代电脑上焕发新生的全能助手
WarcraftHelper:让经典魔兽争霸III在现代电脑上焕发新生的全能助手 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在宽…...
5块钱的国产RISC-V芯片CH32V103能干啥?我用它复刻了一个STM32F103的小项目
5元国产RISC-V芯片实战:用CH32V103复刻STM32经典项目 在电子DIY领域,成本始终是创客们无法回避的现实问题。当我在某电商平台发现CH32V103这颗标价仅5元的RISC-V芯片时,第一反应是怀疑它的实用性——毕竟同级别的STM32F103C8T6价格通常在15-2…...
2025年11月一区SCI-壁虎优化算法Gekko Japonicus Algorithm-附Matlab免费代码
引言 近年来,在合理框架内求解优化问题的元启发式算法的发展引起了全球科学界的极大关注。本期介绍一种新的创新算法——壁虎优化算法Gekko Japonicus Algorithm,GJA。该算法的灵感主要来自于壁虎的捕食策略和生存行为。通过模拟壁虎的混合运动模式、定…...
MusePublic圣光艺苑惊艳效果:大气照明+表达性纹理细节放大展示
MusePublic圣光艺苑惊艳效果:大气照明表达性纹理细节放大展示 1. 引言:当古典艺术遇见AI算力 想象一下,你走进一间19世纪的画室。空气中弥漫着亚麻籽油和矿物颜料的味道,阳光透过高窗洒在亚麻画布上,墙上挂着鎏金画框…...
多模态Agent架构实战落地:从需求分析到生产部署
多模态Agent架构实战落地:从需求分析到生产部署 随着大语言模型技术的普及,单一文本交互的智能系统已无法满足复杂业务场景需求——电商平台需要同时理解用户的商品描述文本、实拍图片和售后语音诉求,教育场景需要处理手写作业、视频讲解和文…...
seo排名大师软件好用吗
SEO排名大师软件好用吗?深入解析其优缺点 在当今数字化营销的环境中,SEO(搜索引擎优化)已成为网站提升流量、吸引潜在客户的重要手段。而SEO排名大师软件作为一种工具,是否真的能帮助我们实现目标?本文将深…...
车载Android Auto兼容性开发全链路(车规级Java SDK集成手册)
第一章:车载Android Auto兼容性开发全链路概览Android Auto 是 Google 提供的车载信息娱乐系统集成框架,其兼容性开发并非仅限于应用层适配,而是一条横跨设备端、车机系统、认证流程与用户交互的完整技术链路。开发者需同步关注 Android 应用…...
告别图形界面!用DM数据库的dlsql命令行工具,5分钟搞定日常数据库运维
命令行利器dlsql:DM数据库高效运维实战指南 在数据库运维的世界里,图形化界面固然直观,但真正的高手往往更青睐命令行工具带来的高效与灵活。DM数据库的dlsql命令行客户端,就是这样一把被许多DBA私藏的"瑞士军刀"。 1. …...
新手福音:借力卓晴式AI,在快马平台轻松完成你的首个网页项目
作为一个刚接触编程的新手,想要创建个人网页却不知从何下手是很常见的情况。最近我发现了一个特别适合新手的组合方案:用AI生成代码在线平台实时调试。下面记录我的完整实践过程,希望能帮到同样想入门的朋友。 明确需求清单 首先梳理出网页需…...
