axios取消请求,解决接口返回顺序错乱问题

news2024/11/27 2:33:34

下面的方案适用于系统中的某个请求的取消,项目的请求使用 axios 封装

使用场景:当页面有多个 tab,例如年、月、日的列表数据,当点击切换的时候要获取对应的数据,此时如果快速点击在tab直接反复横跳会出现下面的问题:

  1. 重复请求,切换了tab旧的页面已经看不见,没必要存留

  2. 如果使用同一套UI组件,只是数据的改变,异步的原因可能当前tab请求已经结束,然后旧的请求后结束,导致当前的页面的数据渲染出来对应不上tab

使用了 axios.CancelToken 去解决这个问题,下面讲解如何去封装

1、防抖节流

第一种能想到的简单的解决办法是使用 防抖节流去处理,发起请求的函数会被取消,但是接口是异步的,没有实质得解决问题,防抖和节流没有解决接口的调用返回顺序的问题,解决的是防止一个接口在短时间内被多次调用的问题,简单来说就是降低调用频率。

第二种能想到的简单方法就是 加锁/加loading,上一次请求未结束之前禁止用户做任何操作,显然这个也是不合理的

2、取消单个重复请求

使用 cancelToken 的语法,把当前请求的取消方法存储起来,当新的请求来到,调用取消方法取消上一次的请求

// 全局封装axios请求

import axios from "axios"

let request = axios.create({
  baseURL: 'www.baudi.com',
})

request.interceptors.request.use((config) => {
  // token
  const { url, headers } = config
  headers["Content-Type"] = "application/json";
  headers.token = 'Bear Lorem ipsum dolor sit, amet consectetur adipisicing elit. Omnis libero assumenda sit cumque natus quasi reiciendis. Quam vitae qui rerum cupiditate expedita dicta deserunt? Quaerat aliquid tempora laudantium quisquam dicta?'
  return config
}, error => {
  return Promise.reject(new Error(error))
})


request.interceptors.response.use(
  // 响应的统一处理
  (res) => {
    const { status } = res.data
    if(status !== 200) {
      return Promise.reject(new Error('请求错误'))
    }
    return Promise.resolve(res)
  },
  // 错误处理
  error => {
    return Promise.reject(new Error(error))
  }
)

export { request }
// api文件夹下 对业务请求的封装

import { request } from "@/request";

//用户列表请求
let cancelFn = () => {}
export const getUserTypeList = () => {
  cancelFn()
  return request({
    url: '/api/user/type/list',
    cancelToken: new axios.CancelToken(c => cancelFn = c )
  })
}

new axios.CancelToken() 中将取消方法c 缓存到了 cancelFn身上,每次发起请求前都调用前一次请求的取消方法,可以看到以下效果

并且,所有的请求都会带上请求配置,例如在请求头中带上了Token

3、当前项目取消重复请求

需要在全局封装axios请求 使用 map(对象)去缓存正在进行中的请求,并使用该请求的url作为key,如果该请求成功、错误、取消都需要从 map(对象) 删除。如果一个请求正在请求中,下一个请求进来,我们可以在 map(对象)中发现存在值,则调用取消请求的方法。

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

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

相关文章

java对象是怎么在jvm中new出来的,在内存中查看java对象成员变量字段属性值

java对象是怎么在jvm中new出来的 查看java对象字段属性在内存中的值 java 对象 创建 流程 附上java源码 public class MiDept {private int innerFiled999;public MiDept() {System.out.println("new MiDept--------------");}public String show(int data) {Sy…

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组? 获取当前时间 获取格式化的时间

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组? 获取当前时间 获取格式化的时间 Python3 JSON 数据解析Python3 日期和时间什么是时间元组?获取当前时间获取格式化的时间 Python3 JSON 数据解析 Python3 中可以使用…

大数据基本名词

目录[-] 1.1. 1. Hadoop1.2. 2. Hive1.3. 3. Impala1.4. 4. Hbase1.5. 5.hadoop hive impala hbase关系1.6. 6. Spark1.7. 7. Flink1.8. 8. Spark 和 Flink 的应用场景 1. Hadoop 开源官网:https://hadoop.apache.org/ Hadoop是一个由Apache基金会所开发的分…

宝宝眼睛轻揉小心,健康成长路上的关怀指南

引言: 宝宝的眼睛是他们认知世界的窗户,眼睛的健康对于他们的成长至关重要。然而,有时我们会发现宝宝揉眼睛的情况,这可能会引起家长的担忧。本文旨在探讨新生儿揉眼睛的注意事项,以及如何正确处理这种情况&#xff0c…

谷歌推出适用于安卓设备的“Find My Device”网络,功能类似苹果Find My

谷歌今日推出了适用于安卓设备的“Find My Device”网络,其功能类似于苹果的“Find My”网络,旨在帮助用户定位丢失、被盗的安卓产品。 安卓的“Find My Device”网络可以利用数以亿计运行 Android 9 或更高版本的安卓设备,通过蓝牙信号追踪丢…

mysql 查询实战-变量方式-解答

对mysql 查询实战-变量方式-题目,进行一个解答。(先看题,先做,再看解答) 1、查询表中⾄少连续三次的数字 1,处理思路 要计算连续出现的数字,加个前置变量,记录上一个的值&#xff0c…

FHE全同态加密简介

1. 何为FHE? FHE (Fully homomorphic encryption): 是一种隐私技术,支持直接对密文进行计算,而无需对密文先解密再计算。即,任何第三方或云厂商,都可对敏感信息的密文进行处理,而无需访问密文内…

Spring 之 IoC概述

目录 1. IoC概述 1.1 控制反转 1.2 依赖注入 2. IoC容器在Spring中的实现 2.1 BeanFactory 2.2 ApplicationContext 2.2.1 ApplicationContext的主要实现类 1. IoC概述 全称:Inversion of Control,译为 “控制反转” Spring通过IoC容器来管理所有…

【DM8】物化视图

物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本,占用存储空间,即将查询出来的数据存储在数据库中。 当所依赖的一个或多个基表的数据发生更新,必须启用刷新机制才能保证数据是最新的。 物化视图可以用于数据复制&#xff08…

Unity 遮罩

编辑器版本 2017.2.3f1 学习Unity的三张遮罩方式 1. Mask 遮罩方式 首先,在界面上创建2个Image,一个命名Img_Mask,大小设置 400* 400, 一个命名Img_Show,大小设置500*500。 然后,给 Img_Mask添加Mask,选择Img_Mask,点击Add Com…

宁波宠物展|2024中国(宁波)国际宠物用品博览会

中国(宁波)国际宠物用品博览会 地点:宁波国际会展中心 时间:2024年11月14-16日 主办单位:凤麟展览(宁波)有限公司 协办单位:浙江省宠物产业协会 宁波市跨境电子商务协会 宁波欧德国际商务咨询服务有限公司 宁波扬扬会议展览有限公司 20000方展览…

获取.apk文件的MD5签名、包名、版本号工具

​​​​​​​https://download.csdn.net/download/Kern_/89112540https://download.csdn.net/download/Kern_/89112540 点击上方链接下载 ApkSignore.jar,按照一下教程使用; 前提要素: 需要电脑安装了jdk及配置了jdk环境变量 安装教程&…

ubuntu20.04.6安装sshd服务,并连接到远程服务器

文章目录 sshd 是 OpenSSH 服务器的守护进程OpenSSH下载在 Ubuntu 上,可以按照以下步骤来管理 sshd 服务 防火墙开启22端口使用Mobaxterm链接服务器 sshd 是 OpenSSH 服务器的守护进程 它负责提供远程登录和安全的 shell 服务。通过启动 sshd 服务,可以…

LangChain - Chain

文章目录 1、概览为什么我们需要链? 2、快速入门 (Get started) - Using LLMChain多个变量 使用字典输入在 LLMChain 中使用聊天模型: 3、异步 API4、不同的调用方法__call__调用仅返回输出键值 return_only_outputs只有一个输出键 run只有一个输入键 5、自定义cha…

Git分布式版本控制系统——Git常用命令(一)

一、获取Git仓库--在本地初始化仓库 执行步骤如下: 1.在任意目录下创建一个空目录(例如GitRepos)作为我们的本地仓库 2.进入这个目录中,点击右键打开Git bash窗口 3.执行命令git init 如果在当前目录中看到.git文件夹&#x…

第一届长城杯初赛部分wp(个人解题思路)

目录 Black web babyrsa2 APISIX-FLOW cloacked 本人不是很擅长ctf,这只是我自己做出的西部赛区部分题的思路,仅供参考 Black web 访问http://192.168.16.45:8000/uploads/1711779736.php 蚁剑连接 访问/var/www/html/u_c4nt_f1nd_flag.php babyr…

Java中利用BitMap位图实现海量级数据去重

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 前言 什么是BitMap?有什么用? 基本概念 位图的优势 …

谷歌seo自然搜索排名怎么提升快?

要想在谷歌上排名快速上升,关键在于运用GPC爬虫池跟高低搭配的外链组合 首先你要做的,就是让谷歌的蜘蛛频繁来你的网站,网站需要被谷歌蜘蛛频繁抓取和索引,那这时候GPC爬虫池就能派上用场了,GPC爬虫池能够帮你大幅度提…

清明美食制作|“心灵护航,增能培力”残疾人职业能力提升培养

为提高残疾人的动手能力,提升个人的自身素质和自主就业创业能力,弘扬中华民族传统文化,临近清明之际,淳安县从益舍社会工作服务中心于浪川乡展开了以“品尝春天味道 制作清明粿 清明美食制作”为主题的清明节活动。 【清明粿制作】…

图片水印生成

请完善 js/index.js 文件中的 TODO 部分&#xff0c;实现创建水印函数的功能 &#xff0c;创建的水印需要使用 <span> 标签展示。 createWatermark 函数参数说明 参数 说明 类型 text 文字内容 string color 颜色值 string deg 旋转角度 numbe…