axios请求的取消

axios请求的取消

解决:axios请求的取消

在使用 Axios 发起请求时,有时候你可能需要取消这些请求,比如当组件销毁时或者用户操作导致不再需要获取之前发起的请求结果。Axios 支持通过 Cancel Token 取消请求。

以下是使用 Axios 的 CancelToken 来取消请求的基本步骤:

创建 Cancel Token:

首先你需要创建一个取消令牌(Cancel Token)。从 Axios 0.18.0 版本开始,推荐的方式是使用 axios.CancelToken.source() 工厂函数来创建一个包含 token 和 cancel 方法的对象。

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

配置请求使用 Cancel Token:

在发起请求时,将上面创建的 token 传递给请求配置中的 cancelToken 字段。

javascript 复制代码
axios.get('/user/12345', {
  cancelToken: source.token
})
.then(function(response) {
  // 处理成功情况
})
.catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // 处理错误情况
  }
});

取消请求:

如果你想取消发起的请求,只需调用 source.cancel() 方法,并可以传入一个可选的取消原因作为参数。

javascript 复制代码
source.cancel('用户取消了请求');

在 Vue 组件中管理取消逻辑(例如,在组件销毁前取消请求):

javascript 复制代码
export default {
  data() {
    return {
      cancelSource: null,
    };
  },
  methods: {
    fetchData() {
      this.cancelSource = axios.CancelToken.source();

      axios.get('/someEndpoint', {
        cancelToken: this.cancelSource.token
      })
      .then(response => {
        // 处理响应数据
      })
      .catch(error => {
        if (axios.isCancel(error)) {
          console.log('Request canceled');
        } else {
          // 处理其他错误
        }
      });
    }
  },
  beforeDestroy() {
    if (this.cancelSource) {
      this.cancelSource.cancel('Component destroyed, request canceled.');
    }
  }
}

以上是在Vue 2 中使用 Axios 取消请求的方法。记得合理管理你的取消令牌,避免内存泄漏或其他潜在问题。

最后附上示例

  • 示例:在输入框里输入1234,会发送4次请求,但只会保留1个请求,其余的请求会被取消

接口处添加cancelToken

javascript 复制代码
export function getERPInfoByDeviceCode(data, cancelToken) {
  return request({
    url: '/v1/dfs/deviceInfo/getERPInfoByDeviceCode',
    method: 'post',
    params: data,
    cancelToken, // 添加取消令牌
  })
}

使用取消请求

javascript 复制代码
// 此处template代码为输入框绑定input事件给getERPInfoByDeviceCodeData()方法即可
<script>
import { getERPInfoByDeviceCode } from '@/api/standard/device-base-api'
import axios from 'axios'
export default {
  data() {
    return {
      cancelToken: null, // 保存取消令牌的引用
    }
  },
  methods: {
    async getERPInfoByDeviceCodeData() {
      // 如果存在之前的请求,取消它
      if (this.cancelToken) {
        this.cancelToken.cancel('用户取消了请求')
      }
      // 创建新的取消令牌
      const cancelTokenSource = axios.CancelToken.source()
      this.cancelToken = cancelTokenSource
      try {
        const params = {}
        // 请求接口传入cancelTokenSource.token配置
        await getERPInfoByDeviceCode(params, cancelTokenSource.token)
      } catch (error) {
        if (axios.isCancel(error)) {
          console.log('Request canceled:', error.message)
        } else {
          // 处理其他错误
          console.error('Error fetching info:', error)
        }
      }
    },
  },
}
</script>



相关推荐
kyriewen4 分钟前
我筛了 1400 个 Claude Code Skills,留下 5 个天天在用的
前端·ai编程·claude
JNX_SEMI19 分钟前
AT2401C 2.4GHz 全集成射频前端单芯片技术解析
前端·单片机·嵌入式硬件·物联网·硬件工程
anOnion37 分钟前
Agentic 前端开发之 实时显示 AI Agent 终端输出
前端·javascript·人工智能
随风一样自由1 小时前
【前端领域】2026最新前端领域全梳理(框架/工具/AI/跨端/底层标准/就业趋势)
前端·人工智能·前端框架
这是个栗子1 小时前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
fei_sun1 小时前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
大爱一家盟2 小时前
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐
大数据·前端·人工智能
彦为君2 小时前
算法思维与经典智力题
java·前端·redis·算法
aa小小2 小时前
localhost 访问异常排查笔记
前端
格子软件2 小时前
2026年GEO优化系统源码的分布式状态机深度拆解
java·前端·vue.js·vue·geo