详解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 相关文章推荐
Javascript 键盘keyCode键码值表
Dec 24 Javascript
jQuery validate 中文API 附validate.js中文api手册
Jul 31 Javascript
微信小程序中顶部导航栏的实现代码
Mar 30 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
Aug 16 Javascript
js中如何完美的解析数据
Mar 18 Javascript
vue数据控制视图源码解析
Mar 28 Javascript
React如何解决fetch跨域请求时session失效问题
Nov 02 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 Javascript
Vue 自定义指令功能完整实例
Sep 17 Javascript
Vuex的各个模块封装的实现
Jun 05 Javascript
微信小程序实现选择地址省市区三级联动
Jun 21 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
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
PHP函数常用用法小结
2010/02/08 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
简述php环境搭建与配置
2016/12/05 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
医院护士的求职信范文
2013/12/26 职场文书
九一八事变演讲稿
2014/09/05 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers