详解Axios 如何取消已发送的请求


Posted in Javascript onOctober 20, 2018

前言

最近在项目中遇到一个问题,在连续发送同一请求时,如果第二次请求比第一次请求快,那么实际显示的是第一次请求的数据,这就会造成数据和我选择的内容不一致的问题。解决的方案:在后续发送请求时,判断之前的请求是否完成(同一个接口),如果未完成则立即取消。然后在发送新的请求。

Axios 介绍

Axios是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

Axios 使用 cancel token 取消请求

Axios的 cancel token API 基于cancelable promises proposal,它还处于第一阶段。

可以使用 CancelToken.source 工厂方法创建 cancel token,像这样:

var CancelToken = axios.CancelToken;
var source = CancelToken.source();

axios.get('/user/12345', {
 cancelToken: source.token
}).catch(function(thrown) {
 if (axios.isCancel(thrown)) {
  console.log('Request canceled', thrown.message);
 } else {
  // 处理错误
 }
});

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

2.还可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建 cancel token:

var CancelToken = axios.CancelToken;
var cancel;

axios.get('/user/12345', {
 cancelToken: new CancelToken(function executor(c) {
  // executor 函数接收一个 cancel 函数作为参数
  cancel = c;
 })
});

// 取消请求
cancel();

我自己在项目中用的是第二种方案:

提取所有的 api 进行封装:

import request from '../utils/request' // 配置过的Axios 对象
import axios from 'axios' 

export function getLatenessDetailSize(params, that) { 
  return request({
    url: '/api/v1/behaviour/latenessDetailSize', 
    method: 'post',
    params: params,
    cancelToken: new axios.CancelToken(function executor(c) { // 设置 cancel token
      that.source = c;
    })
  })
}

export xxx

具体的业务组件:

import { getLatenessDetail } from "../api";
export default {
    data() {
      return {
        tableData: [],
        total: 0,
        page: 1,
        loadTable: false,
        params: { },
        source: null
      }
    },
    methods: {
      cancelQuest() {
        if (typeof this.source === 'function') {
          this.source('终止请求'); //取消请求
        }
      },
      getTableData(val) {
        this.cancelQuest() // 请求发送前调用
        this.page = val
        this.loadTable = true
        getLatenessDetail(this.params, (val - 1) * 10, this)
          .then(
            res => {
              this.loadTable = false
              this.tableData = res.data
            }
        )
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Wordpress ThickBox 添加“查看原图”效果代码
Dec 11 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
Dec 20 Javascript
JavaScript让Textarea支持tab按键的方法
Jun 26 Javascript
jQuery三级下拉列表导航菜单代码分享
Apr 15 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
Jun 01 Javascript
vue keep-alive 动态删除组件缓存的例子
Nov 04 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
May 12 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
Jul 31 Javascript
vue addRoutes路由动态加载操作
Aug 04 Javascript
vue实现验证用户名是否可用
Jan 20 Vue.js
解决await在forEach中不起作用的问题
Feb 25 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
Oct 20 #Javascript
Iview Table组件中各种组件扩展的使用
Oct 20 #Javascript
详解webpack打包第三方类库的正确姿势
Oct 20 #Javascript
详解ES6 Promise对象then方法链式调用
Oct 20 #Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
Oct 20 #Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 #Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 #Javascript
You might like
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
Vue列表页渲染优化详解
2017/07/24 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
浅谈五大Python Web框架
2017/03/20 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
sklearn的predict_proba使用说明
2020/06/28 Python
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
this关键字的含义
2015/04/08 面试题
打架检讨书400字
2014/01/17 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
关于学习的演讲稿
2014/05/10 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
五一劳动节慰问信
2015/02/14 职场文书
接待员岗位职责范本
2015/04/15 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
教师理论学习心得体会
2016/01/21 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
mysql配置SSL证书登录的实现
2021/09/04 MySQL
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
python使用torch随机初始化参数
2022/03/22 Python