Axios 去除重复请求与路由清理方案

作者:橙子时间:2026-10-24 15:07:25浏览:659

本文介绍基于 axios 的两种请求管理机制:一是通过 method、url 及 data 组合判断并取消后续重复 POST 请求;二是在路由跳转时利用 clearPending 统一清理未完成请求。方案依赖 axios 官方 CancelToken 及 qs 库,适用于简化参数处理的场景。

该方案主要实现两项核心功能。

1. 当请求发出后,若后续出现相同请求,则直接取消并不予处理,需等待首次请求执行完毕。 2. 在路由发生跳转时,自动清理当前页面所有尚未完成的请求。

一、取消重复请求

实施前需掌握以下基础知识:

1. 参考 axios 官方文档中关于 的使用说明。 2. 理解 JavaScript 中 Map 数据结构的基本概念。 3. 使用安全的查询字符串解析与分解库 ,其功能类似于 JavaScript 原生的 JSON 处理。

为简化参数处理逻辑,本方案仅针对 POST 请求进行判断:当 method、url 以及 data 完全相同时,即视为重复请求。


// axios.js
const pending = new Map()
/**
 * 添加请求
 * @param {Object} config
 **/
const addPending = (config) => {
  const url = [
    config.method,
    config.url,
    qs.stringify(config.data)
  ].join('&')
  if (pending.has(url)) { // 如果 pending 中存在当前请求则取消后面的请求
    config.cancelToken = new axios.CancelToken(cancel => cancel(`重复的请求被主动拦截: ${url}`))
  } else { // 如果 pending 中不存在当前请求,则添加进去
    config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => {
      pending.set(url, cancel)
    })
  }
}
/**
 * 移除请求
 * @param {Object} config
 */
const removePending = (config) => {
  const url = [
    config.method,
    config.url.replace(config.baseURL, ''), // 响应url会添加域名,需要去掉与请求URL保持一致
    qs.stringify(JSON.parse(config.data)) // 需要与request的参数结构保持一致,request中是对象,response中是字符串
  ].join('&')
  if (pending.has(url)) { // 如果在 pending 中存在当前请求标识,取消当前请求,并且移除
    pending.delete(url)
  }
}

/* axios全局请求参数设置,请求拦截器 */
axios.interceptors.request.use(
  config => {
    addPending(config) // 将当前请求添加到 pending 中
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截器即异常处理
axios.interceptors.response.use(
  response => {
    removePending(response.config) // 在请求结束后,移除本次请求
    return response
  },
  err => {
    if (err && err.config) {
      removePending(err.config) // 在请求结束后,移除本次请求
    }
    return Promise.resolve(err.response)
  }
)

二、清理所有请求


// axios.js
/**
 * 清空 pending 中的请求(在路由跳转时调用)
 */
export const clearPending = () => {
  for (const [url, cancel] of pending) {
    cancel(url)
  }
  pending.clear()
}

// router.js
router.beforeEach((to, from, next) => {
  // 路由跳转,清除所有请求
  clearPending()
  })

至此,关于 Axios 去除重复请求方案的介绍已完成。如需了解更多相关内容,欢迎查阅本站过往文章或继续阅读后续文章,感谢大家的支持!

作者最新文章