当前位置: 首页 > news >正文

【HTTP】取消已发送的请求

场景

        在页面中,可能会因为某些操作多次触发某个请求,如多次点击某按钮触发请求,实际上我们只需要最后一次请求的返回值,但是由于请求的耗时不一,请求未必会按发送的顺序返回,导致我们最终获取到的值 ≠ 最后一次发送请求的返回值

根据项目经验,目前一共尝试过两种方法

1. 设置请求的唯一 id 

2. 使用 axios 官方方法:AbortController

解决

1. 设置请求的唯一 id

        为每个请求设置一个唯一 id,每触发一次请求,id+1,多次触发请求后,取值时根据请求 id 值来对应取值。

使用示例如下:

// 设置请求id初始值为0
sessionStorage.setItem('id', JSON.stringify(0))
/*** 发送请求* @param data 请求参数*/
function query(data) {loading.value = true// priceId加1,并存储在session里const priceId = JSON.parse(sessionStorage.getItem('id')) + 1sessionStorage.setItem('id', JSON.stringify(priceId))queryApi(data).then(res => {// 根据session中的priceId, 取最后一次请求的返回值if (priceId === JSON.parse(sessionStorage.getItem('id'))) {// 处理业务逻辑const { resultData } = res}}).catch(err => {// 业务处理逻辑}).finally(() => {loading.value = false})
}const url = '/query/abc'
function queryApi(paramsObj) {return httpInstance.post(url, paramsObj)
}

2. AbortController方法

        AbortController 是 axios 官方提供的取消请求的 api,使用时注意:

        1. 该 api 仅在 Axios 版本>=V0.22.0 时生效。

        2. Axios 版本<V0.22.0 时请使用 CancelToken

        3. 允许取消一个或多个正在进行的请求,但如果请求已经成功响应则不能取消。

官网文档链接:取消请求 | Axios中文文档 | Axios中文网

使用示例如下:

// 用于存储当前的 AbortController 实例
let currentController = null
/*** 发送请求* @param data 请求参数*/
function query(data) {loading.value = true// 取消之前的请求if (currentController) {currentController.abort()currentController = null}const controller = new AbortController()currentController = controller //重置AbortControllerqueryApi(data, controller.signal).then(res => {const { resultData } = res// 业务处理逻辑.....loading.value = false}).catch(err => {if (err.name === 'CanceledError') {console.log('请求被取消', err.message)} else {console.error('请求失败', err)loading.value = false}})
}const url = '/query/abc'
function queryApi(paramsObj, signal) {return httpInstance.post(url, paramsObj, {signal: signal})
}

http://www.lryc.cn/news/574594.html

相关文章:

  • Linux线程概念及常用接口(1)
  • OSS客户端签名直传实践:Web端安全上传TB级文件方案(含STS临时授权)
  • 从牛顿流体到弹性固体:旋转流变仪的高精度流变特性测定与工业应用
  • Unity_UI_NGUI_UI组件
  • 对人工智能的厌倦感是真实存在的,而且它给品牌带来的损失远不止是参与度的下降
  • 【Linux网络编程】多路转接I/O(一)select,poll
  • 51c嵌入式~电路~合集8
  • 一、永磁同步电机矢量控制——电机数学模型
  • 第十节 新特性与趋势-CSS层叠规则升级
  • AI智能化高效办公:WPS AI全场景深度应用指南
  • 设计模式系列(09):结构型模式 - 适配器模式
  • ffmpeg环境配置
  • HTTP响应头Content-Disposition解析
  • 【MV】编排8:基于时间线数据多层分段避免过度拟合特定歌曲
  • Verilog基础:编译指令`default_nettype
  • Windows搭建opencv cuda开发环境并验证是否成功
  • VO,DTO,BO,PO,DO
  • 7.5.3_2处理冲突的方法-开放定址法
  • Redis 分布式锁原理与实战-学习篇
  • 快速搭建系统原型,UI界面,有哪些高效的AI工具和方法
  • PLA/PHA生物降解化妆品包装材料的稳定性与货架期契合性研究
  • 3D人物建模与WebGL渲染实战
  • bmc TrueSight 监控 Oracle 11g 配置
  • Selenium 4.0 + AI:重构自动化测试的智能革命
  • 【大模型问题】ms-swift微调时,显存持续增长原因分析与解决方案
  • Python Bug 修复案例分析:编码问题导致程序出现bug 两种修复方法
  • FSMC控制LCD(TFTLCD:Z350IT002)显示案例
  • CUDA NCU Occupancy学习笔记
  • 触觉智能RK3506核心板/开发板-开源鸿蒙+星闪分享(上)
  • Web Worker 通信封装与实战应用详解