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. 请求超时 && 网络错误单独判断,因为没有 response
            if (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

我们主要使用第一种方式:

  1. 实例化取消控制器接口,控制器对象有一个信号标记signal
  2. 将该标记配置给 axios 同名的 signal配置
  3. 控制器对象调用abort()方法就能取消被标记了的请求。
const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// 取消请求
controller.abort()

封装取消请求功能

取消请求也是个基础功能,因此和全局错误拦截器一样在构造函数中注册拦截器。

取消请求:

  1. 为每一个请求生成一个控制器 controller,并添加 signal
  2. 维护一个 map,以 url 为 key,对应的 controller 为 value
  3. 要取消哪个请求就通过 url,获取它的 controller 来取消
  4. 在全局响应拦截器中,给所有请求添加 signal,并在请求结束后从 map 中剔除该 url 对应的 controller

封装类暴露两个方法:

  1. 取消全部请求
  2. 根据 url 取消请求
class HttpRequest {
    private readonly instance: AxiosInstance;
    private readonly abortControllerMap: Map<string, AbortController>;

  	constructor(config: MyAxiosRequestConfig) {
      	this.instance = axios.create(config);

        // 为每个请求都生成一个 signal,并以 url 为 key 添加入 map
        this.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中去除 url
        this.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);
        });
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/119565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数智化人物展】觉非科技CEO李东旻:数据闭环,智能驾驶数智时代发展的新引擎...

李东旻 本文由觉非科技CEO李东旻投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 数智化的主要作用是帮助决策。它的核心是大数据&#xff0c;以大数据为基础&#xff0c;匹配合适的AI技术&#xff0c;促使数…

list、numpy、tensor之间相互转化

参考博客【精选】python 中各类型介绍及相互转换 - list, array, tensor, dict, tuple, DataFrame_dict转tensor-CSDN博客 1 # list -> numpy scores np.array(scores) # list -> numpy 2 # numpy -> tensor scores torch.tensor(scores) # numpy -> tensor…

css 图片好玩的一个属性,添加滤镜

鼠标经过效果对比&#xff1a; 上图是改变了图片的饱和度&#xff0c;代码如下&#xff1a; .img-box .v-image:hover {filter: saturate(1.75); }其他滤镜说明如下图&#xff1a;

apache-tomcat-9.0.29 安装配置教程

链接&#xff1a;https://pan.baidu.com/s/100buXYpn8w8xjI2KdvHk2Q?pwd2mwc 提取码&#xff1a;2mwc 1.将压缩包解压到指定文件夹下 2.进入bin文件夹下 3.找到setclasspath.bat文件 4.推荐用notepad打开文件&#xff0c;并做如下配置&#xff08;可解决tomcat启动闪退问题&…

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845)

Juniper Networks Junos OS EX远程命令执行漏洞&#xff08;CVE-2023-36845&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: body"J-web" || title"Juniper Web Device Manager" 漏洞复现1. 构造poc2. 查看文件3. 执行命令 免责声明 仅用于技…

阿里微服务质量保障系列:故障演练

对于很多大型企业(如阿里巴巴)来说,经过多年的技术演进,系统工具和架构已经高度垂直化,服务器规模也达到了比较大的体量。当服务规模大于一定量(如10000台)时,小概率的硬件故障每天都会发生。这时如果需要人的干预,系统就无法可靠的伸缩。 为此每一层的系统都会面向失…

如何使用 NFTScan NFT API 在 Arbitrum 网络上开发 Web3 应用

Arbitrum 是以太坊的 Layer 2 扩容方案&#xff0c;为以太坊面临的高 gas 费和网络拥堵问题&#xff0c;提供了一个解决方案。作为 Layer 1 的以太坊基础层受每秒只能验算 15 笔交易的限制&#xff0c;在目前以太坊使用需求庞大的情况下&#xff0c;局限了以太坊的可扩展性。Ar…

C# Onnx Dense Face 3D人脸重建,人脸Mesh

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.…

用HTML + javaScript快速完成excel表格信息除重并合并

今天突然接到一个工作&#xff0c;要把两个存储在.xls的主体信息表&#xff0c;除重后合并成一个主体信息表&#xff0c;并且补充主体类型和所在县区这两列信息。 完成这项工作的方法有很多&#xff0c;如果信息表中的信息量不大的话&#xff0c;手工处理一下也行&#xff0c;如…

跨境电商年底风控升级,测评养号如何选择稳定且纯净的IP环境?

随着年底跨境电商平台风控的升级&#xff0c;许多测评团队的账号存活率有所下降。对于自养号测评的卖家来说&#xff0c;IP的重要性不言而喻。除了设置参数阻断&#xff0c;IP的质量也直接影响到账户的稳定性和成功率。因此&#xff0c;在年底这个特殊时期&#xff0c;所有测评…

Elasticsearch内存分析

文章目录 Elasticsearch JVM内存由哪些部分组成Indexing BufferNode Query CacheShard Request CacheField Data CacheSegments Cache查询 非堆内存内存压力mat分析es的jvm缓存监控 Elasticsearch JVM内存由哪些部分组成 官方建议Elasticsearch设置堆内存为32G&#xff0c;因为…

工业5G路由器;小体积 千兆高速通信组网

计讯物联工业路由器TR232&#xff0c;5G高速网络&#xff0c;超低时延、高可靠性&#xff0c;小体积、易安装、强兼容&#xff0c;串口/网口多设备接入联网&#xff0c;为用户提供高速稳定的数据传输通道 。    小体积5G工业路由器TR323&#xff0c;外形1047824mm&#xff0…

Android ConstraintLayout

0dp 充满约束 to左侧是控件本身,to右边是约束条件 例如: app:layout_constraintBottom_toBottomOf"id/image_1" app:layout_constraintTop_toBottomOf"id/image_1" 指定权重: app:layout_constraintHorizontal_weight"" app:layout_constra…

如何用AI帮助撰写毕业论文

自从推出以来&#xff0c;ChatGPT几乎涉足了所有领域。尽管刚开始时它很谦逊&#xff0c;但由于GPT 3.5发布&#xff0c;这个AI聊天机器人获得了超能力。随着这个聊天机器人能够编写复杂的代码、博客文章、论文等等&#xff0c;它确实可以做很多事情。然而&#xff0c;今天我们…

高校为什么需要大数据挖掘平台?

目前数据挖掘已经成为各种应用领域的重要技术&#xff0c;大学数据挖掘课程的开放已经出现。数据挖掘课程整合了多门学科知识。该课程包括各种理论知识&#xff0c;也离不开相关的实用技术。整个教学过程是培养和提高学生全面创新和解决问题的能力。过去&#xff0c;教学过程理…

C#学习中关于Visual Studio中ctrl+D快捷键(快速复制当前行)失效的解决办法

1、进入VisualStudio主界面点击工具——>再点击选项 2、进入选项界面后点击环境——>再点击键盘&#xff0c;我们可用看到右边的界面的映射方案是VisualC#2005 3、 最后点击下拉框&#xff0c;选择默认值&#xff0c;点击之后确定即可恢复ctrlD的快捷键功能 4、此时可以正…

免费好用的网页采集工具软件推荐

在众多各具特色的采集器软件中&#xff0c;真正好用的采集器软件有哪些&#xff1f; 自己一个个去查找和尝试无疑会耗费大量的时间和精力。 因此&#xff0c;在深入体验大多数采集器后&#xff0c;给大家推荐几款优秀且好用的免费网页采集器软件。 本文将对这几款采集器进行…

Sentinel 哨兵数据 更新下载地址 2023年11月

1. 欧空局官方下载 2023年11月开始&#xff0c;原来欧空局的下载地址和应用有了变化&#xff0c;现在迁移到以下新地址下载&#xff1a; https://dataspace.copernicus.eu/ 我这边测试需要重新注册用户才能进行登录和使用&#xff0c;界面使用和之前差不多&#xff0c;具体操作…

Bash 4关联数组:错误“声明:-A:无效选项”

Bash 4 associative arrays: error “declare: -A: invalid option” 就是bash版本太低 1.先确定现在的版本 bash -version 我的就是版本太低 升级新版本bash4.2 即可 升级步骤 1.下载bash-4.2wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz 2. 下载完成解压 tar -zxvf…

Android Studio(RecyclerView)

前言 ListView的缺点&#xff0c;在RecyclerView得到了补充改善&#xff08;横纵向排列子元素、多列布局等等&#xff09; 代码 前面在适配器章节已经介绍了其对应的适配器&#xff0c;这里就简单展示一下多列布局的页面效果和相关代码 <androidx.recyclerview.widget.Recyc…