彻底解决重复请求:vue-vben-admin中的AbortController请求中断方案

彻底解决重复请求:vue-vben-admin中的AbortController请求中断方案

【免费下载链接】vue-vben-admin 【免费下载链接】vue-vben-admin 项目地址: https://gitcode.com/gh_mirrors/vue/vue-vben-admin

在前端开发中,你是否遇到过用户快速点击按钮导致重复请求的问题?或者页面切换时未完成的请求仍在继续执行?这些问题不仅浪费网络资源,还可能导致数据不一致或错误的业务状态。vue-vben-admin作为一个企业级中后台解决方案,提供了基于AbortController的请求取消机制,完美解决了这些问题。本文将深入解析这一机制的实现原理和使用方法,让你彻底掌握请求中断的精髓。

请求取消的必要性与痛点

在现代Web应用中,用户交互频繁,特别是在数据密集型的管理后台,一个操作可能触发多个API请求。以下场景尤其需要请求取消机制:

  • 用户快速点击提交按钮导致的重复请求
  • 页面切换时,前一页未完成的请求应该被终止
  • 搜索框输入时,频繁触发的搜索请求需要取消上一次请求
  • 长时间未响应的请求需要手动或自动取消

这些问题如果不妥善处理,可能会导致:

  • 服务器负载增加
  • 客户端内存泄漏
  • 数据展示异常或冲突
  • 用户体验下降

vue-vben-admin通过AbortController API实现了高效的请求取消机制,相关核心实现位于src/utils/http/axios/axiosCancel.ts文件中。

AbortController:现代浏览器的原生解决方案

AbortController是浏览器提供的原生API,用于中止一个或多个DOM请求。它由两部分组成:

  • AbortController:创建一个控制器对象
  • AbortSignal:信号对象,连接控制器和需要中止的请求

它们之间的关系可以用以下流程图表示:

mermaid

在vue-vben-admin中,这一API被封装在AxiosCanceler类中,实现了对Axios请求的统一管理和取消。

vue-vben-admin中的请求取消实现

vue-vben-admin的请求取消机制主要通过两个核心文件实现:

  1. src/utils/http/axios/axiosCancel.ts:实现请求取消的核心逻辑
  2. src/utils/http/axios/index.ts:Axios实例配置,集成请求取消功能

AxiosCanceler类解析

AxiosCanceler类是请求取消机制的核心,它通过一个Map对象存储每个请求的标识和对应的取消函数。主要包含以下方法:

  • addPending(config): 添加请求到待取消列表
  • removePending(config): 从待取消列表移除并取消请求
  • removeAllPending(): 取消所有待处理请求
  • reset(): 重置待取消列表

以下是该类的核心代码实现:

// 用于存储每个请求的标识和取消函数
const pendingMap = new Map<string, AbortController>();

// 生成请求标识
const getPendingUrl = (config: AxiosRequestConfig): string => {
  return [config.method, config.url].join('&');
};

export class AxiosCanceler {
  /**
   * 添加请求
   * @param config 请求配置
   */
  public addPending(config: AxiosRequestConfig): void {
    this.removePending(config);
    const url = getPendingUrl(config);
    const controller = new AbortController();
    config.signal = config.signal || controller.signal;
    if (!pendingMap.has(url)) {
      // 如果当前请求不在等待中,将其添加到等待中
      pendingMap.set(url, controller);
    }
  }
  
  /**
   * 移除请求
   * @param config 请求配置
   */
  public removePending(config: AxiosRequestConfig): void {
    const url = getPendingUrl(config);
    if (pendingMap.has(url)) {
      // 如果当前请求在等待中,取消它并将其从等待中移除
      const abortController = pendingMap.get(url);
      if (abortController) {
        abortController.abort(url);
      }
      pendingMap.delete(url);
    }
  }
  
  // 其他方法实现...
}

与Axios集成

src/utils/http/axios/index.ts中,通过VAxios类将AxiosCanceler集成到请求流程中:

  1. 在请求发送前调用addPending方法添加请求到待取消列表
  2. 在请求完成后调用removePending方法移除请求
  3. 在需要时调用removeAllPending方法取消所有请求

关键集成代码如下:

// 请求拦截器中添加请求到待取消列表
requestInterceptors: (config, options) => {
  // ...其他逻辑
  axiosCanceler.addPending(config);
  return config;
},

// 响应拦截器中移除请求
responseInterceptorsCatch: (axiosInstance: AxiosInstance, error: any) => {
  // ...其他逻辑
  const { config } = error || {};
  axiosCanceler.removePending(config);
  return Promise.reject(error);
}

实际应用场景与使用方法

vue-vben-admin的请求取消机制在以下场景中自动生效:

  1. 重复请求自动取消:当相同的请求(相同方法和URL)再次发送时,会自动取消上一次未完成的请求
  2. 页面切换时取消请求:路由切换时,会自动取消上一页未完成的请求
  3. 组件卸载时取消请求:Vue组件卸载时,相关的请求会被自动取消

如果你需要在特定场景手动取消请求,可以通过以下方式:

import { defHttp } from '/@/utils/http/axios';

// 发送请求时获取取消令牌
const source = axios.CancelToken.source();

// 发送请求
defHttp.get({
  url: '/api/data',
  cancelToken: source.token
});

// 在需要取消请求的地方调用
source.cancel('Operation canceled by the user.');

高级应用:自定义请求取消策略

vue-vben-admin允许你在发送请求时自定义请求取消策略,通过请求配置中的ignoreCancelToken选项控制:

// 不忽略取消令牌,允许取消请求(默认)
defHttp.get({
  url: '/api/data',
  requestOptions: {
    ignoreCancelToken: false
  }
});

// 忽略取消令牌,不允许取消请求
defHttp.get({
  url: '/api/important-data',
  requestOptions: {
    ignoreCancelToken: true
  }
});

总结与最佳实践

vue-vben-admin的请求取消机制基于AbortController实现,通过AxiosCanceler类统一管理请求的取消逻辑,有效解决了重复请求和无用请求的问题。在实际开发中,建议:

  1. 对于频繁触发的请求(如搜索框输入),使用请求取消机制减少不必要的网络请求
  2. 对于耗时较长的请求,提供手动取消按钮提升用户体验
  3. 在路由守卫中使用removeAllPending()方法取消页面切换时的未完成请求
  4. 对于关键数据的请求,设置ignoreCancelToken: true确保请求不被取消

通过合理使用vue-vben-admin提供的请求取消机制,可以显著提升应用性能和用户体验,减少不必要的网络资源消耗。

官方相关资源:

【免费下载链接】vue-vben-admin 【免费下载链接】vue-vben-admin 项目地址: https://gitcode.com/gh_mirrors/vue/vue-vben-admin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值