详解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匿名函数应用示例介绍
Mar 07 Javascript
JavaScript利用正则表达式去除日期中的-
Jun 09 Javascript
让html页面不缓存js的实现方法
Oct 31 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
Sep 09 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
May 13 Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
Vue.js 实现数据展示全部和收起功能
Sep 05 Javascript
vue解决一个方法同时发送多个请求的问题
Sep 25 Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 Javascript
微信小程序tab左右滑动切换功能的实现代码
Feb 08 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.ini中文版(1)
2006/10/09 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
php验证手机号码
2015/11/11 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
jquery简单体验
2007/01/10 Javascript
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
基于JavaScript实现选项卡效果
2017/07/21 Javascript
详解webpack进阶之loader篇
2017/08/23 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
Python实现CET查分的方法
2015/03/10 Python
Python字符串处理实现单词反转
2017/06/14 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
python七夕浪漫表白源码
2019/04/05 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
python处理写入数据代码讲解
2020/10/22 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
高分子材料个人求职信范文
2013/09/25 职场文书
奖学金自我鉴定范文
2013/10/03 职场文书
孝老爱亲模范事迹
2014/01/24 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书