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

news/2024/7/10 3:03:55 标签: 前端, axios, react, vue

下面的方案适用于系统中的某个请求的取消,项目的请求使用 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.niftyadmin.cn/n/5474771.html

相关文章

Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅

引言 Node.js作为一个基于Chrome V8引擎的JavaScript运行时环境,已经成为现代web开发中不可或缺的重要工具之一。它的出现极大地扩展了JavaScript的应用范围,使得开发者可以利用同一种语言来编写前端和后端的代码,从而实现全栈开发。Node.js…

Docker是一个开源的应用容器引擎

Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker技术的…

JetBrains IDE 2024.1 发布 - 开发者工具

JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具 CLion, DataGrip, DataSpell, Fleet, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, Rider, RubyMine, WebStorm 请访问原文链接:JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具&#xff0…

Python编程-带你制作实用工具-语音识别、音频转换、音频转文字、录音转Mp3、文字生成音频(附代码和源码)

目录 音频mp3、flac、wav、ogg格式转换 安装 批量执行 SpeechRecognition 安装 下载中文声学模型和语言模型 音频转文字 文字转语音 安装pyttsx3

WPS快速将插入Excle数据插入Word

前置条件: 一张有标题、数据的excle表格word中的表格与excle表格标题对应或包含电脑已经安装WPS软件 第一步、根据word模板设计excle模板,标头对应 第二步、word上面选【引用】--【邮件】,选打开数据源,找到excle文件,…

安卓手机APP开发的音频和视频概述

安卓手机APP开发的音频和视频概述 目录 概述 Jetpack Media3 回放组件 Media3 MediaSession MediaSessionService MediaController MeidaBrowser Media3 Exoplayer 编辑组件 Media3 Transformer Effects EditedMediaItem UI组件 Media3 UI Jetpack MediaRouter…

富格林:打击暗箱黑幕正常出金

富格林指出,在进行黄金交易时,对于投资者来说最大的困难莫过于把价格走势看好,却因自己的交易技巧欠缺而落入暗箱黑幕之中从而错失出金的机会。因此,掌握投资的具体技巧对于打击暗箱黑幕是非常关键的。下面富格林将给大家分享一些…

花一分钟简单认识 CSS 中的规则 ——媒体查询 @media

media 媒体查询 基本语法 media media-type and (media-feature-rule) {/* CSS rules go here */ }通过几个小案例就能简单学会媒体查询 案例一:当屏幕宽度小于 600px 时生效的规则 media screen and (max-width: 600px) { }案例二:当屏幕宽度在 600…