Axios取消请求:AbortController

news2024/9/22 21:17:40

AbortController

   AbortController() 构造函数创建了一个新的 AbortController 实例。MDN官网给出了一个利用AbortController取消下载视频的例子。

         核心逻辑是:利用AbortController接口的只读属性signal标记fetch请求;然后在需要取消请求的时候,调用AbortController接口的abort()方法立即取消请求,并抛出一个错误AbortError

const controller = new AbortController();
const signal = controller.signal;

const url = "video.mp4";
const downloadBtn = document.querySelector(".download");
const abortBtn = document.querySelector(".abort");

downloadBtn.addEventListener("click", fetchVideo);

abortBtn.addEventListener("click", () => {
  controller.abort();
  console.log("Download aborted");
});

function fetchVideo() {
  fetch(url, { signal })
    .then((response) => {
      console.log("Download complete", response);
    })
    .catch((err) => {
      console.error(`Download error: ${err.message}`);
    });
}

只读属性signal

        AbortController接口的只读属性 signal 返回一个 AbortSignal 实例对象,该对象可以根据需要处理 DOM 请求通信,既可以建立通信,也可以终止通信。

方法:abort()

        AbortController接口的 abort() 方法会在 DOM 请求完成之前中止它。它能够中止 fetch 请求、各种响应主体或者流的消耗。

取消Axios请求

既然 AbortController接口的 abort() 方法可以终止fetch请求、各种响应主体或者流的消耗,那么我们考虑将其和axios结合,来取消axios的请求。

        查看axios官网,也给出了相关介绍:

        为了便于在项目中使用,我们在对其进行一个简单的封装,示例如下:

//axios配置
        function createRequest() {
            const request = axios.create({
                baseURL: "https://geo.datav.aliyun.com",
                headers: {
                    "Content-Type": "application/json;charset=utf-8",
                }
            })

            const cachePool = new Map()

            const encode = (baseURL, method, url, params) => {
                const str = `${baseURL}_${url}_${method}_${JSON.stringify(params || {})}`;
                const encoder = new TextEncoder();
                //接受一个字符串作为输入,返回一个包含 UTF-8 编码的文本的 Uint8Array
                const bytes = encoder.encode(str)
                //使用Base64编码算法进行编码:将一个二进制字符串(例如,将字符串中的每一个字节都视为一个二进制数据字节)编码为 Base64 编码的 ASCII 字符串
                const encoded = btoa(String.fromCharCode(...bytes))
                return encoded
            }

            /**
             * 对Axios请求实例的config进行编码
             * */
            const configEncode = (config) => {
                //获取基本信息
                const baseURL = config.baseURL,
                    method = config.method,
                    url = config.url,
                    params = config?.params || config?.data || {};
                //返回编码结果
                return encode(baseURL, method, url, params);
            }

            //请求拦截器
            request.interceptors.request.use(
                (config) => {
                    // 在发送请求之前做些什么
                    console.log(config)
                    const controller = new AbortController()
                    config.signal = controller.signal
                    //根据config配置信息进行编码
                    const encodeKey = configEncode(config)
                    console.log("encodeKey:", encodeKey)
                    //判断请求是否存在
                    if (cachePool.get(encodeKey)) {
                        controller.abort()
                        console.log('cachePool--cancel:', cachePool)
                    } else {
                        cachePool.set(encodeKey, { abort: controller })
                        console.log('cachePool--set:', cachePool)
                    }
                    return config;
                },
                (error) => {
                    // 对请求错误做些什么
                    console.log(error);
                    return Promise.reject(error);
                }
            );

            //响应拦截器
            // 添加响应拦截器
            request.interceptors.response.use(function (response) {
                // 2xx 范围内的状态码都会触发该函数。
                // 对响应数据做点什么
                const encodeKey = configEncode(response.config)
                console.log('response---:', response, encodeKey)
                //缓存对象
                const cacheItem = cachePool.get(encodeKey)
                if (cacheItem) {
                    console.log("res-success:删除缓存对象")
                    cachePool.delete(encodeKey)
                }
                return response;
            }, function (error) {
                // 超出 2xx 范围的状态码都会触发该函数。
                // 对响应错误做点什么
                console.log('axios-error:', error)
                if (error.code === "ERR_CANCELED") {
                    //被取消的axios请求
                    console.warn(`被取消的重复请求~`)
                } else {
                    //其它错误
                    return Promise.reject(error);
                }
            });

            //返回
            return request
        }

        接下来做个简单的测试,

        const request = createRequest()

        const getData = () => {
            return request.get("/areas_v3/bound/420800_full.json", {
                params: {
                    a: 1
                }
            })
        }

        getData().then(result => {
            console.log(result)
        })
        getData().then(result => {
            console.log(result)
        })
        getData().then(result => {
            console.log(result)
        })

        查看执行结果:连续发送了3次请求,后两个被取消掉,最终只有一个请求正常返回了请求结果。

其它取消Axios请求的方式

        参考:Vue:Axios前端拦截器_vue axios拦截器-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣1143. 最长公共子序列(动态规划)

Problem: 1143. 最长公共子序列 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们先假设已经将两个字符串转换为两个char类型的数组(t1,t2)便于比较 1.如果t1[i] t2[j],有三种决策:(i1,j1)&a…

第二篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像处理

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列 博文目录一、项目目标二、第一个示例代码三、第二个示例代码四、第三个示例代码五、第四个示例代码六、第五个示例代码七、知识点归纳总结 系列短博文目录 Python的OpenCV库技术点案例示例短博文…

初识k8s(概述、原理、安装)

文章目录 概述由来主要功能 K8S架构架构图组件说明ClusterMasterNodekubectl 组件处理流程 K8S概念组成PodPod控制器ReplicationController(副本控制器)ReplicaSet (副本集)DeploymentStatefulSet (有状态副本集&#…

docker配置node项目

首先在项目根目录创建Dockerfile FROM node:18.19RUN mkdir /appCOPY . /appWORKDIR /appRUN npm installEXPOSE 8081CMD ["npm","run","start"]添加.dockerignore文件 /dist /node_moduleslogs *.log npm-debug.log* yarn-debug.log* yarn-er…

Linux中如何根据一个单词快速锁定到日志

Linux中如何根据一个单词快速锁定到日志 记住,人生的价值不在于终点的远近,而在于沿途的风景和历经的风雨。每一步都是成长,每一刻都是奇迹。保持一颗热情奔放的心,勇敢地迎接生活的挑战,你将会发现,每一天…

ppt流程图模板怎么绘制?手把手教你绘制PPT流程图

ppt流程图模板怎么绘制?在工作中,演示文稿中的流程图往往能够清晰地展示项目的流程和逻辑,使观众更好地理解内容。但是,很多人在制作PPT时,可能会对如何绘制流程图感到困惑。今天,就给大家手把手教一下如何…

基于springboot+vue的网上点餐系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景和意…

JavaEE 网络原理

JavaEE 网络原理 文章目录 JavaEE 网络原理1. 网络互连1.1 局域网LAN1.2 广域网WAN 2. 网络通信基础2.1 IP地址2.2 端口号 3. 网络协议3.1 概念3.2 五元组3.3 协议分层3.4 TCP/IP 五层模型3.5 封装和分用 1. 网络互连 随着时代的发展,需要多个计算机协同工作来完成…

中仕教育:选调生和考研可以一起准备吗?

研究生入学考试,是本科生们提升学历继续深造的主要途径。而选调生,是指通过考试选拔的优秀应届毕业生,经过锻炼后分配到各级工作。这两者作为大部分人选择的方向,发展前景都是比较好的。 考研和选调生可以一起准备吗? 是可以的…

8. UE5 RPG创建UI(上)

UI是显示角色的一部分属性玩家可以直接查看的界面,通过直观的形式在屏幕上显示角色的各种信息。如何使用一种可扩展,可维护的形式来制作,这不得不说到耳熟能详的MVC架构。 MVC(Model-View-Controller)是一种常见的软件…

计算机网络-AAA原理概述

对于任何网络,用户管理都是最基本的安全管理要求之一,在华为设备管理中通过AAA框架进行认证、授权、计费实现安全验证。 一、AAA概述 AAA(Authentication(认证), Authorization(授权), and Accounting(计费))是一种管理框架&#…

vue3-组件基础

什么是组件 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行处理。在实际应用中,组件常常被组织成层层嵌套的树状结构。 定义一个组件 我们一般会将 Vue 组件定义在一个单独的 .vue 文件中,这被叫做单文件组件 (简称…

Leetcode刷题笔记题解(C++):670. 最大交换

思路: 假设数字 9923676 从右边找最大的数字的下标maxindex,然后向左边寻找小于最大数字的数的下标,直到找到最左边,交换两者得出新的数字,比如从左到右递减的数字如9621则不需要变化,在寻找中记录这种数…

最长子字符串的长度(二) - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出’l’、‘o’、‘x’ 字符都恰好出现了偶数次最长子字符串的长度。 输入描…

【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析 代码实现: 一、冒泡排序 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大…

前端JavaScript篇之实现有序数组原地去重方法有哪些?

目录 实现有序数组原地去重方法有哪些?方法一:使用 Set 数据结构代码实现:思路说明: 方法二:使用双指针遍历代码实现:思路说明: 实现有序数组原地去重方法有哪些? 在 JavaScript 中…

Dockerfile-xxxx

1、Dockerfile-server FROM openjdk:8-jdk-alpine WORKDIR /app COPY . . CMD java -Xms1536M -Xmx1536M -XX:UseG1GC -jar -Dlog4j2.formatMsgNoLookupstrue -Dloader.pathresources,lib -Duser.timezoneGMT-05 /app/server-main-1.0.0.jar 2、Dockerfile-bgd #FROM openjdk…

(笔记总结)C/C++语言的常用库函数(持续记录,积累量变)

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

代码+视频R语言绘制逆概率加权后的基线表

基于 PS (倾向评分)的逆概率加权(IPTW )法首先由Rosenbaum作为一种以模型为基础的直接标准化法提出,属于边际结构模型。简单来说,就是把许多协变量和混杂因素打包成一个概率并进行加权,这样的话&#xff0c…

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin 在 Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin-CSDN博客 基础上,这次使用ScaleGestureDetector检测两根手指的缩放动作&a…