返回顶部
首页 > 资讯 > 前端开发 > JavaScript >浅谈axios中取消请求及阻止重复请求的方法
  • 449
分享到

浅谈axios中取消请求及阻止重复请求的方法

2024-04-02 19:04:59 449人浏览 薄情痞子
摘要

目录前言核心——CancelToken实际应用和封装一些小细节前言 在实际项目中,我们可能需要对请求进行“防抖”处理。这里主要是为了阻

前言

在实际项目中,我们可能需要对请求进行“防抖”处理。这里主要是为了阻止用户在某些情况下短时间内重复点击某个按钮,导致前端后端重复发送多次请求。这里我列举两种比较常见的实际情况:

  • PC端 - 用户双击搜索按钮,可能会触发两次搜索请求
  • 移动端 - 因移动端没有点击延迟,所以极易造成误操作或多操作,造成请求重发

以上情况有可能在有Loading遮罩时依然发生,所以我们要考虑前端阻止重复请求的方法。

核心——CancelToken

在AxiOS中取消请求最核心的方法是CanelToken。在官网文档中有写到两种方法使用CancelToken,这里简单粘贴出来,并增加了注释

方法1:


const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  // 必须对请求进行cancelToken设置
  cancelToken: source.token
}).catch(function (thrown) {
  // 如果请求被取消则进入该方法判断
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

// 取消上面的请求
// source.cancel('messge') message为可选项,必须为String
source.cancel('Operation canceled by the user.');

方法2:


const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  // 在options中直接创建一个cancelToken对象
  cancelToken: new CancelToken(function executor(c) {
    cancel = c;
  })
});

// 取消上面的请求
cancel();

实际应用和封装

上文已对axios中的核心方法进行了举例,但是在实际中我们往往不会像官网例子中那样使用,更多的是在axios的拦截器中做全局配置管理。这样的话我们需要对上面的代码进行一些改变。

这里说一下我实现的大体思路:

  • 我们需要对所有正在进行中的请求进行缓存。在请求发起前判断缓存列表中该请求是否正在进行,如果有则取消本次请求。
  • 在任意请求完成后,需要在缓存列表中删除该次请求,以便可以重新发送该请求

思路说完,我们直接上代码


// 正在进行中的请求列表
let reqList = []


const stopRepeatRequest = function (reqList, url, cancel, errORMessage) {
  const errorMsg = errorMessage || ''
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      cancel(errorMsg)
      return
    }
  }
  reqList.push(url)
}


const allowRequest = function (reqList, url) {
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      reqList.splice(i, 1)
      break
    }
  }
}

const service = axios.create()

// 请求拦截器
service.interceptors.request.use(
  config => {
 let cancel
   // 设置cancelToken对象
    config.cancelToken = new axios.CancelToken(function(c) {
     cancel = c
    })
    // 阻止重复请求。当上个请求未完成时,相同的请求不会进行
    stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
    return config
  },
  err => Promise.reject(err)
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 增加延迟,相同请求不得在短时间内重复发送
    setTimeout(() => {
      allowRequest(reqList, response.config.url)
    }, 1000)
    // ...请求成功后的后续操作
    // successhandler(response)
  },
  error => {
    if (axios.isCancel(thrown)) {
      console.log(thrown.message);
    } else {
      // 增加延迟,相同请求不得在短时间内重复发送
      setTimeout(() => {
        allowRequest(reqList, error.config.url)
      }, 1000)
    }
    // ...请求失败后的后续操作
    // errorHandler(error)
  }
)

一些小细节

为什么没用前文方法2中的代码进行cancelToken设置?
axios的文档中有一条备注:

Note: you can cancel several requests with the same cancel token.
你可以使用相同的Token来取消多个请求

所以我不想在每个请求前都new一个新的对象
请务必使用方法2,保证每次cancel都能正确执行。之前方法会导致当出现cancel后,后续请求也会持续cancel

为什么在response中需要增加延迟?
因为不想让用户在极短的时间内重复进行相同请求。
请注意,在response中阻止请求和在request中的阻止请求是两个概念:
request中是阻止上个请求 未完成 时又开始了相同的请求
response中是阻止上个请求 完成后 一段时间内不允许相同请求

我能否在cancel时传递一个对象,而不仅仅是message?
以官方提供的接口来看是不可以的,你可以仿照官方源码进行重新封装,或者使用第三方插件,或者使用另一个方法:将对象转换为JSON字符串,然后在需要的地方再转换回来

到此这篇关于浅谈axios中取消请求及阻止重复请求的方法的文章就介绍到这了,更多相关axios中取消请求及阻止重复请求内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈axios中取消请求及阻止重复请求的方法

本文链接: https://lsjlt.com/news/134104.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈axios中取消请求及阻止重复请求的方法
    目录前言核心——CancelToken实际应用和封装一些小细节前言 在实际项目中,我们可能需要对请求进行“防抖”处理。这里主要是为了阻...
    99+
    2024-04-02
  • Vue中Axios中取消请求及阻止重复请求的方法
    目录阻止请求目的:常见情况:新建 axios.js 文件全局 main.js 引入阻止请求目的: 为了防止用户在网络不好或者其他情况下短时间内重复进行接口请求,从而导致前端向后端重复...
    99+
    2024-04-02
  • axios取消请求与避免重复请求
    目录起源 现状 取消请求 cancelToken 修改后的请求方法 避免重复请求 总结起源 某个页面需要下载全部数据的功能,下载数据量大,接口延迟长..... 某个页面加载初始数据...
    99+
    2024-04-02
  • 浅谈Axios去除重复请求方案
    目录一、取消重复请求二、清理所有请求此方案主要有两个功能 1.请求发出后,后续重复请求取消不处理,等待第一次请求完成。 2.路由跳转后,上一个页面未完成请求全部清理。 一、取消重复...
    99+
    2024-04-02
  • 前端取消请求及取消重复请求方式
    目录一、前言二、项目准备三、原生方法四、promise五、借助Promise.race六、总结一、前言 今天,我想跟大家分享几种前端取消请求的几种方式。 相信大家在平时的开发中,肯定...
    99+
    2024-04-02
  • Axios中怎么取消重复请求
    这篇文章将为大家详细讲解有关Axios中怎么取消重复请求,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、如何取消请求Axios 是一个基于 Promise...
    99+
    2024-04-02
  • Axios取消重复请求的方法实例详解
    目录前言一、如何取消请求二、如何判断重复请求三、如何取消重复请求3.1 定义辅助函数3.2 设置请求拦截器3.3 设置响应拦截器四、CancelToken 的工作原理五、总结六、参考...
    99+
    2024-04-02
  • web前端怎么取消请求及取消重复请求
    今天小编给大家分享一下web前端怎么取消请求及取消重复请求的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项目准备在正式学习之...
    99+
    2023-07-02
  • vue axios拦截器常用之重复请求取消
    引言 上一篇介绍了axios的简单封装,知道了axios拦截器的应用场景和方法,今天来看一下对于响应时间过长且请求次数过高的情况拦截器如何处理。 取消请求的方法 Axios使用内部...
    99+
    2024-04-02
  • Vue路由切换和Axios接口取消重复请求详解
    目录前言场景解决方案axios中如何取消请求项目中封装使用总结参考前言 在日常前端开发中, 经常会遇到频繁发起的重复请求, 会给服务器及网络造成不必要的压力, 可通过取消重复请求解决...
    99+
    2024-04-02
  • spring防止重复请求的方法是什么
    在Spring中可以通过以下几种方式来防止重复请求: Token-based防重复提交:在表单中添加一个Token(令牌),每次...
    99+
    2024-04-02
  • vue中axios如何实现重复点击取消上一次请求封装
    这篇文章主要为大家展示了“vue中axios如何实现重复点击取消上一次请求封装”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中axios如何实现重复点击取...
    99+
    2024-04-02
  • Vue3在Setup中使用axios请求获取的值方式
    目录Setup中使用axios请求获取的值Vue3+Setup使用知识点Setup中使用axios请求获取的值 上次我们使用axios给项目搞上了网络请求,从此项目数据不再是静态的。...
    99+
    2024-04-02
  • vue中如何实现基于axios的ajax请求方法
    小编给大家分享一下vue中如何实现基于axios的ajax请求方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如下所示:imp...
    99+
    2024-04-02
  • java中springMVC获取请求参数的方法
    目录原生方式获取请求参数控制器方法形参获取请求参数@RequestParam注解@RequestHeader注解@CookieValue注解通过POJO获取请求参数原生方式获取请求参...
    99+
    2023-05-18
    springMVC 请求参数 springMVC 请求
  • React中使用axios发送请求的几种常用方法
    目录React中安装并引入axios依赖 使用axios进行GET请求 使用axios.get方式 使用axios(config {...}) 使用axios进行POST请求 使用a...
    99+
    2024-04-02
  • SpringBoot2中使用@RequestHeader获取请求头的方法
    目录一、使用@RequestHeader获取请求头(一)获取某一个请求头(二)获取数值型请求头(三)一次性获取所有请求头二、@RequestHeader注解详解(一)name、val...
    99+
    2024-04-02
  • Spring Boot中获取request的三种方式及请求过程
    目录一、请求过程二、获取request的三种方式2.1、可以封装为静态方法2.2、controller的方法里面2.3、直接注入三、request常用API3.1、request路径...
    99+
    2024-04-02
  • java并发请求下数据插入重复问题的解决方法
    目录前言分布式锁工具类在过滤器实现请求拦截总结前言 前段时间发现数据库里经常会存在两条相同的用户数据,导致数据查询异常。查了原因,发现前端微信小程序在授权登录时,有时会出现同时发送了...
    99+
    2024-04-02
  • 利用js或ajax或php获取请求头及里面东西的方法
    js获取请求头其中信息,通过XMLHttpRequest var req = new XMLHttpRequest();req.open('GET', document.location, false);req.send(null);v...
    99+
    2023-09-10
    前端 开发语言 php javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作