详解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 进度条 实现代码
Jul 30 Javascript
jQuery AJAX 调用WebService实现代码
Mar 24 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
Nov 16 Javascript
JavaScript学习笔记之JS函数
Jan 22 Javascript
SuperSlide标签切换、焦点图多种组合插件
Mar 14 Javascript
浅谈javascript属性onresize
Apr 20 Javascript
解决jquery实现的radio重新选中的问题
Jul 03 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
使用AngularJS2中的指令实现按钮的切换效果
Mar 27 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
详解用async/await来处理异步
Aug 28 Javascript
详解Vue数据驱动原理
Nov 17 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函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
jQuery搜索子元素的方法
2015/02/10 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
Python列表的切片实例讲解
2019/08/20 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Python笔记之工厂模式
2019/11/20 Python
python3排序的实例方法
2020/10/20 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
小学班主任寄语大全
2014/04/04 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS