javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > Axios请求取消机制

一文深入详解Axios请求取消机制

作者:拉不动的猪

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js,在实际开发中,有时候需要取消已经发起的请求,下面小编就和大家简单聊聊Axios的请求取消机制吧

Axios是否真的支持取消请求呢

是的,Axios 完全支持取消请求

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

1. 使用AbortController(推荐)

AbortController 是 Web 标准 API,用于中止一个或多个 Web 请求。Axios 从 v0.22.0 开始支持它,并推荐使用这种方式。

示例代码:

import axios from 'axios';

// 1. 创建一个 AbortController 实例
const controller = new AbortController();
const signal = controller.signal; // 获取 AbortSignal 对象

// 2. 在 Axios 请求配置中传入 signal
axios.get('/api/data', { signal })
  .then(response => {
    console.log('请求成功:', response.data);
  })
  .catch(error => {
    // 检查错误是否是由于请求取消引起的
    if (axios.isCancel(error)) {
      console.log('请求被取消:', error.message);
    } else {
      console.log('请求发生错误:', error.message);
    }
  });

// 3. 在需要取消请求时调用 controller.abort()
// 例如,在组件卸载时,或者用户点击了取消按钮时
setTimeout(() => {
  controller.abort(); // 这会触发 signal 上的 abort 事件,Axios 会捕获并取消请求
  console.log('请求已尝试取消');
}, 100); // 100ms 后取消请求

优点:

2. 使用CancelToken(旧版,已废弃但仍兼容)

CancelToken 是 Axios 早期提供的取消请求机制。虽然现在推荐使用 AbortController,但如果你在使用旧版本的 Axios 或者需要兼容旧代码,它仍然可用。

示例代码:

import axios from 'axios';

// 1. 创建一个 CancelToken.Source 工厂函数
const CancelToken = axios.CancelToken;
const source = CancelToken.source(); // source 对象包含 token 和 cancel 方法

// 2. 在 Axios 请求配置中传入 token
axios.get('/api/data', { cancelToken: source.token })
  .then(response => {
    console.log('请求成功:', response.data);
  })
  .catch(error => {
    // 检查错误是否是由于请求取消引起的
    if (axios.isCancel(error)) {
      console.log('请求被取消:', error.message);
    } else {
      console.log('请求发生错误:', error.message);
    }
  });

// 3. 在需要取消请求时调用 source.cancel()
// 例如,在组件卸载时,或者用户点击了取消按钮时
setTimeout(() => {
  source.cancel('用户取消了请求'); // 传入一个可选的消息
  console.log('请求已尝试取消');
}, 100); // 100ms 后取消请求

优点:

在旧版本 Axios 中广泛使用。

缺点:

何时需要取消请求

取消请求在前端开发中非常有用,常见场景包括:

总之,Axios 提供了强大且灵活的请求取消机制,推荐在现代项目中使用 AbortController

这种取消是前端拒绝接收数据还是真的停止http的请求链接呢?

1. 它是如何“真取消”的?(浏览器层面)

当你调用 controller.abort()(或旧版的 cancelToken)时,Axios 会调用浏览器底层的 API(XMLHttpRequest.abort() 或 fetch 的 signal 机制)。

这意味着:

对比:  如果仅仅是“前端不予接收”,浏览器会傻傻地把 100MB 下载完,然后你的代码再把数据扔掉。Axios 的取消是前者,直接掐断连接,节省资源。

2. 服务器端发生了什么?(后端层面)

这是最容易产生误解的地方。 “前端取消了请求”并不代表“后端撤销了操作”。

请求已发出:在大多数情况下,当你点击取消时,请求指令已经通过网络发送到了服务器。

服务器正在处理:服务器收到请求后,开始查询数据库、计算数据或写入记录。

连接中断:此时前端断开了连接。

举个例子:

你在餐厅点了一道菜(发送请求)。

厨师开始做菜(服务器处理)。

你突然有急事走了,跟服务员说“我不要了”(前端取消请求)。

3. 总结:三种情况

根据取消的时机不同,效果也不同:

请求还在排队(极少见)

请求在传输中/服务器处理中(最常见)

响应已到达浏览器

核心建议

用于优化体验:Axios 的取消非常适合用于搜索框联想(输入 a 发请求,紧接着输入 ab,此时取消 a 的请求)或切换 Tab。这能有效防止“旧数据的响应覆盖了新数据”的 Bug,并节省带宽。

不要依赖它来回滚数据:如果你发的是 POST 请求(比如“付款”),千万不要指望前端取消就能阻止服务器扣款。后端必须要有幂等性设计或专门的撤销接口。

到此这篇关于一文深入详解Axios请求取消机制的文章就介绍到这了,更多相关Axios请求取消机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文