axios取消请求CancelToken的用法示例代码

 更新时间:2023年10月10日 08:57:51   作者:康师傅不会煮面  
Axios提供了取消请求的功能,可以通过使用CancelToken来实现,这篇文章主要给大家介绍了关于axios取消请求CancelToken的用法,文中通过代码介绍的非常详细,需要的朋友可以参考下

axios中取消请求情况分为1:取消该请求之后的相同请求;2:取消该请求之前的相同请求

取消该请求之后的相同请求:

在使用 axios 发送请求时,如果在短时间内连续发送同一个请求,可能会出现请求结果混乱或重复响应的问题。为了避免这种情况,我们可以使用 axios 的取消请求功能,每次发送请求前先取消之前的请求。下面是使用 axios 取消请求的示例代码:

import axios from 'axios';
 // 创建一个 CancelToken 对象
const source = axios.CancelToken.source();
 // 发送请求
axios.get('/api/data', {
  // 将 cancelToken 属性设置为上面创建的 CancelToken 实例
  cancelToken: source.token
}).then(response => {
  console.log(response.data);
}).catch(error => {
  console.error(error);
});
 // 取消之前的请求
source.cancel('Duplicate request');

在上面的代码中,我们先创建一个 CancelToken 对象 source ,并将其传递给发送请求的 cancelToken 属性中。然后在需要取消之前请求的时候,调用 source.cancel() 方法即可。此时,后续的请求将不会被发送,以避免重复响应。

需要注意的是,如果在请求被取消之前,请求已经被发送并成功响应,那么该已经成功响应的请求结果无法被取消,因此也需要对已经成功响应的请求结果做好处理。另外,也需要处理请求被取消的异常情况,以避免出现错误。

取消该请求之前的相同请求:

在 axios 中,取消上一次请求与取消前面的所有请求是有差别的。取消上一次请求,我们可以记录当前请求的 cancelToken ,然后在下一次请求之前发送一个取消请求的操作。而取消前面的所有请求,我们需要维护一份请求队列,然后在新的请求发起之前,将之前的所有请求都取消掉。

下面是一个实现取消前面的所有请求的例子:

import axios from 'axios';
 // 创建一个请求队列
let pending = [];
const CancelToken = axios.CancelToken;
const removePending = (config) => {
  for (let p in pending) {
    if (pending[p].url === config.url + '&' + config.method) {
      pending[p].cancel("request canceled");
      pending.splice(p, 1);
    }
  }
}
 // 添加请求拦截器
axios.interceptors.request.use(
  (config) => {
    removePending(config);
    config.cancelToken = new CancelToken((c) => {
      pending.push({ cancel: c, url: config.url + '&' + config.method });
    });
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
 // 响应拦截器
axios.interceptors.response.use(
  (response) => {
    removePending(response.config);
    return response;
  },
  (error) => {
    return Promise.reject(error);
  }
);

在上面的代码中,我们创建了一个请求队列 pending ,然后为请求配置添加了一个 cancelToken ,并将其推入请求队列中。在发送新的请求之前,我们遍历请求队列,将之前的所有请求都取消掉,并从请求队列中移除。同时,我们还需要在响应拦截器中将已经完成的请求从请求队列中移除。

需要注意的是,如果发送的请求是无法取消的,例如使用 jsonp 发送的请求,那么上面的代码将无法取消这类请求。因此,我们需要根据实际情况选择合适的方式来取消请求。

取消之后再次发送请求提示被cancel怎么办?

如果在 axios 中取消了一个请求,那么再次发送同样的请求会提示 Cancellation 已经被取消的错误。这是因为 axios 同样的请求已经被 cancel ,因此无法再次发送。如果需要再次发送同样的请求,需要重新创建一个新的 cancelToken ,否则会一直提示被取消。

下面是一个重新创建 cancelToken 的示例代码:

import axios from 'axios';
let cancelToken = axios.CancelToken;
let cancel;
let config = {
  method: 'get',
  url: '/api/data',
  cancelToken: new cancelToken(function executor(c) {
    // executor 函数接收一个 cancel 函数作为参数
    cancel = c;
  })
};
// 添加请求拦截器
axios.interceptors.request.use(
  (config) => {
    // 如果 cancel 存在说明上次请求被取消了,重新创建一个
    if (typeof cancel === 'function') {
      config.cancelToken = new cancelToken(function executor(c) {
        cancel = c;
      });
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
// 发送请求
axios(config)
  .then((response) => {
    console.log(response);
  })
  .catch((error) => {
    if (axios.isCancel(error)) {
      console.log('Request canceled', error.message);
    } else {
      console.log(error);
    }
  });
// 取消请求
cancel();

在上面的代码中,我们在发送请求前先创建了一个 cancelToken ,并将 cancel 函数保存下来。当发送请求时,我们检查 cancel 函数是否存在,如果存在说明上次请求被取消了,那么我们需要重新创建一个 cancelToken 并将其传递给新的请求中。这样就可以在取消请求后重新发送同样的请求了。

由于axios是对XHR对象的封装,如果请求已经被发送并且服务器已经接收到请求,那么cancelToken 在调用 abort() 方法取消请求可能会导致一部分数据已经被传输。因此,使用 时需要谨慎。

fetch请求才可以做到真正意义上的取消!!!

总结

到此这篇关于axios取消请求CancelToken的用法的文章就介绍到这了,更多相关axios取消请求CancelToken内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue 服务端渲染SSR示例详解

    Vue 服务端渲染SSR示例详解

    这篇文章主要介绍了Vue 服务端渲染SSR示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 在vant 中使用cell组件 定义图标该图片和位置操作

    在vant 中使用cell组件 定义图标该图片和位置操作

    这篇文章主要介绍了在vant 中使用cell组件 定义图标该图片和位置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Vue组件如何设置Props实例详解

    Vue组件如何设置Props实例详解

    props主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与data、el、ref是一个级别的配置项,下面这篇文章主要给大家介绍了关于Vue组件如何设置Props的相关资料,需要的朋友可以参考下
    2022-06-06
  • vue3.0如何在全局挂载对象和方法

    vue3.0如何在全局挂载对象和方法

    这篇文章主要介绍了vue3.0如何在全局挂载对象和方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue中如何使用echarts和echarts-gl实现3D饼图环形饼图

    vue中如何使用echarts和echarts-gl实现3D饼图环形饼图

    现在vue是很多公司前端的主流框架,我目前所在公司接触的项目也都是使用vue来实现的,很少有完全使用原生的JavaScript来写项目的了,下面这篇文章主要给大家介绍了关于vue中如何使用echarts和echarts-gl实现3D饼图环形饼图的相关资料,需要的朋友可以参考下
    2023-03-03
  • vue element-plus图片预览实现方法

    vue element-plus图片预览实现方法

    这篇文章主要给大家介绍了关于vue element-plus图片预览实现的相关资料,最近的项目中有图片预览的场景,也是踩了一些坑,在这里总结一下,需要的朋友可以参考下
    2023-07-07
  • 在vue项目中利用popstate处理页面返回的操作介绍

    在vue项目中利用popstate处理页面返回的操作介绍

    这篇文章主要介绍了在vue项目中利用popstate处理页面返回的操作介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue3 diff算法的简单解刨

    Vue3 diff算法的简单解刨

    如今Vue3的势头正盛,在diff算法方面也做了相应的变化,利用到了最长递增子序列把性能又提升了一个档次。本文就来带大家简单解刨一下Vue3中的diff算法
    2023-02-02
  • 在vue项目中引入vue-beauty操作方法

    在vue项目中引入vue-beauty操作方法

    在本篇文章里小编给大家分享了关于在vue项目中引入vue-beauty操作方法,有需要的朋友们跟着学习参考下。
    2019-02-02
  • vue动态绑定多个类名方法详解(:class动态绑定多个类名)

    vue动态绑定多个类名方法详解(:class动态绑定多个类名)

    vue中可以通过:class=""这样来根据一定的条件来动态添加class,但是有时候需要判断的条件比较多,需要动态添加的class也比较多,下面这篇文章主要给大家介绍了关于vue动态绑定多个类名(:class动态绑定多个类名)的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论