解决重复请求与取消未响应请求

📡 Axios 请求封装:解决重复请求与取消未响应请求

本项目封装了基于 axios 的 HTTP 请求类 Request,用于自动管理重复请求、取消未响应请求等场景,提升接口调用的效率与用户体验。

🔧 核心功能概述

  1. 防止重复请求:
    • 在发起新请求前判断是否存在相同请求,如果有,则主动取消上一次请求。
  2. 取消所有未响应请求:
    • 提供静态方法 cancelAllPendingRequests,可一次性中止所有尚未完成的请求。

🧩 功能实现细节

✅ 请求唯一标识生成

每个请求根据其方法、URL、paramsdata 生成唯一键值,用于识别是否为重复请求。

ts 复制代码
private static generateRequestKey(config: AxiosRequestConfig): string {
  const { method, url, params, data } = config;
  return [method, url, JSON.stringify(params), JSON.stringify(data)].join('&');
}

🔁 重复请求处理机制

在请求拦截器中:

  1. 通过 generateRequestKey 获取当前请求的唯一标识。
  2. 检查是否已有相同请求正在进行。
  3. 若存在,使用 AbortController 中止旧请求,并更新记录。
  4. 为当前请求创建新的 AbortController,并存入 pendingRequests Map 中。
ts 复制代码
if (pendingRequests.has(requestKey)) {
  pendingRequests.get(requestKey)?.abort();
  pendingRequests.delete(requestKey);
}

const controller = new AbortController();
res.signal = controller.signal;
pendingRequests.set(requestKey, controller);

🛑 响应处理与清理逻辑

在响应拦截器中,无论请求成功还是失败,都会移除对应的请求记录:

ts 复制代码
const requestKey = Request.generateRequestKey(response.config);
pendingRequests.delete(requestKey);

如果是取消请求(如用户主动切换页面、重复请求等),则记录不会保留,也不会弹出错误提示。

🧹 批量取消所有未响应请求

提供一个静态方法 cancelAllPendingRequests,当需要清空所有请求时(如路由切换、退出登录),调用此方法即可:

ts 复制代码
public static cancelAllPendingRequests(): Promise<void> {
  return new Promise((resolve) => {
    pendingRequests.forEach((controller) => {
      controller.abort();
    });
    pendingRequests.clear();
    resolve();
  });
}

📦 使用场景

  • 页面快速切换时取消旧请求,防止数据错乱或内存泄漏。
  • 用户多次点击相同操作按钮时,确保只处理最新请求。
  • 后台任务或轮询中止机制。
  • 全局错误处理与提示统一封装。

🚀 未来优化方向

  • 增加白名单机制,允许某些接口重复发送请求。
  • 配置化支持某些请求不参与去重逻辑。
  • 针对大文件上传、下载的特殊处理策略。

📁 示例调用方式

ts 复制代码
import Request from '@/utils/request';

const request = new Request({
  baseURL: '/api',
  timeout: 10000,
});

request.instance.get('/user/info').then((data) => {
  console.log('User Info:', data);
});

// 取消所有请求(例如在页面卸载时调用)
Request.cancelAllPendingRequests();

✅ 小结

封装 axios 请求类不仅解决了重复请求的浪费问题,也提升了用户交互体验。结合 AbortController 实现取消机制,是现代前端接口管理中的推荐做法。

如需深入定制或拓展其他功能,可继续增强 Request 类的灵活性与配置性。

相关推荐
Alan Lu Pop12 分钟前
前端开发助手
前端·智能体
程序员鱼皮13 分钟前
我用 GitHub 仓库养 AI 龙虾,自动开发上线项目!保姆级教程
前端·人工智能·ai·程序员·github·编程·ai编程
276695829227 分钟前
京东随机变速滑块拼图验证码识别(京东E卡)
java·服务器·前端·python·京东滑块·京东变速滑块·京东e卡绑卡
এ慕ོ冬℘゜41 分钟前
手写生产级 jQuery Toast 轻量提示组件|零插件依赖、动画流畅、极简高
前端·javascript·jquery
Oneslide1 小时前
UI设计-企业OA风格
前端
程序员海军1 小时前
我用了 8 个月 Codex CLI,总结出这套 AI 编程工作流
前端·后端·aigc
এ慕ོ冬℘゜2 小时前
手写一款高兼容、零BUG图片预览组件|前端
前端·bug
铁链鞭策大师2 小时前
javaEE之多线程(2)
java·前端·java-ee
KaMeidebaby2 小时前
卡梅德生物技术快报|生信实操:ChIP 染色质免疫共沉淀技术流程、短板与替代方案详解
前端·人工智能·物联网·百度·新浪微博
weixin199701080162 小时前
[特殊字符] 【性能提升300%】仿1688首页的Webpack优化全记录(附构建分析Python脚本)
前端·python·webpack