详解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 相关文章推荐
jquery ajax 同步异步的执行示例代码
Jun 23 Javascript
B/S模式项目中常用的javascript汇总
Dec 17 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
Dec 24 Javascript
JS简单实现动画弹出层效果
May 05 Javascript
学习vue.js计算属性
Dec 03 Javascript
jQuery实现手机上输入后隐藏键盘功能
Jan 04 Javascript
js实现带简单弹性运动的导航条
Feb 22 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
May 08 jQuery
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 Javascript
webpack优化的深入理解
Dec 10 Javascript
layUI实现列表查询功能
Jul 27 Javascript
使用vue制作滑动标签
Sep 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 在线打包_支持子目录
2008/06/28 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
javascript 控制弹出窗口
2007/04/10 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
vue如何判断dom的class
2018/04/26 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
项目经理的岗位职责
2013/11/23 职场文书
阿德的梦教学反思
2014/02/06 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫