详解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 相关文章推荐
Add a Table to a Word Document
Jun 15 Javascript
基本jquery的控制tabs打开的数量的代码
Oct 17 Javascript
$.ajax返回的JSON无法执行success的解决方法
Sep 09 Javascript
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
JavaScript通过事件代理高亮显示表格行的方法
May 27 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
js实现延时加载Flash的方法
Nov 26 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
May 09 Javascript
详解Vue.js中.native修饰符
Apr 24 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
ES2020 已定稿,真实场景案例分析
May 25 Javascript
node运行js获得输出的三种方式示例详解
Jul 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 上传文件大小限制
2009/07/05 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
asp 的 分词实现代码
2007/05/24 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
详解node中创建服务进程
2017/05/09 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
vue v-model的用法解析
2020/10/19 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
物流专业求职计划书
2014/01/10 职场文书
教师对学生的寄语
2014/04/03 职场文书
分公司任命书
2014/06/06 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
转让协议书
2015/01/27 职场文书
大学教师个人总结
2015/02/10 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
Python echarts实现数据可视化实例详解
2022/03/03 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python