详解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 相关文章推荐
js 回车提交表单两种实现方法
Dec 31 Javascript
JavaScript html5 canvas绘制时钟效果
Mar 01 Javascript
jQuery添加和删除输入文本框标签代码
May 20 Javascript
JS实现颜色梯度与渐变效果完整实例
Dec 30 Javascript
Bootstrap 3 进度条的实现
Feb 22 Javascript
AngularJS实现根据不同条件显示不同控件
Apr 20 Javascript
js实现日期显示的一些操作(实例讲解)
Jul 27 Javascript
基于Three.js实现360度全景图片
Dec 30 Javascript
jQuery实现的别踩白块小游戏完整示例
Jan 07 jQuery
vue+elementUI实现图片上传功能
Aug 20 Javascript
vue项目中引入Sass实例方法
Aug 27 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
Nov 02 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和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
招商经理岗位职责
2013/11/16 职场文书
英语道歉信范文
2014/01/09 职场文书
给女儿的表扬信
2014/01/18 职场文书
会计演讲稿范文
2014/05/23 职场文书
计算机专业自荐信
2015/03/05 职场文书
开除员工通知
2015/04/22 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
于丹论语心得观后感
2015/06/15 职场文书
2019消防宣传标语!
2019/07/10 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL