axios取消请求

Axios 取消请求

Axios 提供了两种主要的方式来取消请求:

1. 使用 CancelToken (旧版方式,已弃用但仍可用)

javascript 复制代码
const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('请求已取消', thrown.message);
  } else {
    // 处理其他错误
  }
});

// 取消请求
source.cancel('操作被用户取消');

2. 使用 AbortController (推荐的新方式,从 v0.22.0 开始)

‌AbortController 是 JavaScript 中用于中止异步操作的全局 API‌,通过其 signal 属性和 abort() 方法,可终止 Fetch 请求、事件监听、数据流等异步任务。

其核心能力包括统一管理多个异步操作的中止行为和简化资源清理逻辑。‌‌‌‌

‌核心概念与基础用法‌

‌组成部分‌。

AbortController 实例包含两个关键部分:

signal:一个 AbortSignal 对象,用于向异步 API 传递中止信号。‌‌‌‌

abort() 方法:触发 signal 的中止事件,标记异步操作为已中止状态。‌‌

‌基本代码结构‌。

javascript 复制代码
const controller = new AbortController();

axios.get('/user/12345', {
  signal: controller.signal
}).then(response => {
  // 处理响应
}).catch(err => {
  if (axios.isCancel(err)) {
    console.log('请求已取消:', err.message);
  } else {
    // 处理其他错误
  }
});

// 取消请求
controller.abort('操作被用户取消');

调用 abort() 后,所有关联的异步操作将立即终止并抛出 AbortError。‌‌‌‌

标题主要应用场景

网络请求控制‌

中断长时间未完成的 Fetch 请求。‌‌‌‌

避免用户重复提交请求(如搜索框输入防抖)。‌‌

‌事件监听自动清理‌

通过单个 signal 统一移除多个事件监听器,替代手动调用 removeEventListener。‌‌‌‌
‌框架集成‌

在 React 的 useEffect 钩子中集中清理副作用。‌‌

封装 Axios 请求拦截器实现全局重复请求取消。‌‌

‌使用注意事项‌

要点 说明

错误处理 需捕获 AbortError 并区分其他错误类型‌‌‌‌

兼容性 现代浏览器广泛支持,旧版本需 Polyfill‌‌‌‌

性能优化 避免滥用导致频繁请求中断,增加服务器负担‌‌‌‌

状态复用 已中止的 signal 不可重复使用,需重新创建实例‌‌

实际应用示例

在 React 组件中使用

jsx 复制代码
import React, { useEffect } from 'react';
import axios from 'axios';

function UserComponent({ userId }) {
  useEffect(() => {
    const controller = new AbortController();
    
    const fetchData = async () => {
      try {
        const response = await axios.get(`/api/users/${userId}`, {
          signal: controller.signal
        });
        // 处理数据
      } catch (err) {
        if (axios.isCancel(err)) {
          console.log('请求已取消:', err.message);
        } else {
          // 处理其他错误
        }
      }
    };
    
    fetchData();
    
    return () => {
      // 组件卸载时取消请求
      controller.abort('组件卸载,取消请求');
    };
  }, [userId]);

  return <div>用户信息展示</div>;
}

在 Vue 中取消重复请求

javascript 复制代码
// 存储所有活跃请求的控制器
const activeRequests = new Map();

// 添加请求
function addRequest(config) {
  const controller = new AbortController();
  config.signal = controller.signal;
  const url = `${config.method}:${config.url}`;
  activeRequests.set(url, controller);
  return config;
}

// 移除请求
function removeRequest(config) {
  const url = `${config.method}:${config.url}`;
  if (activeRequests.has(url)) {
    activeRequests.delete(url);
  }
}

// 取消重复请求
function cancelRequest(config) {
  const url = `${config.method}:${config.url}`;
  if (activeRequests.has(url)) {
    activeRequests.get(url).abort('取消重复请求');
    activeRequests.delete(url);
  }
}

// 请求拦截器
axios.interceptors.request.use(config => {
  cancelRequest(config); // 取消之前的相同请求
  return addRequest(config);
});

// 响应拦截器
axios.interceptors.response.use(
  response => {
    removeRequest(response.config);
    return response;
  },
  error => {
    removeRequest(error.config);
    return Promise.reject(error);
  }
);

注意事项

  1. 取消请求会触发错误,需要使用 axios.isCancel() 来区分是取消错误还是其他错误
  2. 每个请求只能取消一次
  3. 取消请求后,Promise 会被 reject
  4. 在组件卸载时取消请求是良好的实践,可以避免内存泄漏
  5. 对于频繁触发的请求(如搜索框输入),取消之前的请求可以提升性能

AbortController 是现代浏览器原生支持的标准 API,推荐使用这种方式而不是旧的 CancelToken。

相关推荐
A接拉起0078 分钟前
2026 年 JavaScript 开发者需要了解的知识
前端·javascript·后端
_馒头9 分钟前
pixiJs游戏开发实践 - 跳棋小游戏
javascript·vue.js
用户114818678948413 分钟前
面试官:大屏项目里十几个模块同时渲染上万条数据,怎么做到不卡?
前端·性能优化
前端市界16 分钟前
Pro React Admin: 统一工程底座,承载多种应用...
前端·github
葡萄城技术团队23 分钟前
dsh-spreadjs-editor 当前支持什么:安装前需要了解的几件事
前端
沫璃染墨24 分钟前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
三*一44 分钟前
优化修整算法
前端·javascript·算法
达子6661 小时前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
道尔柯南1 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀2 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具