详解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 在各个浏览器中执行的耐性
Apr 06 Javascript
js获取图片大小的函数代码
Sep 20 Javascript
分享使用AngularJS创建应用的5个框架
Dec 05 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
Sep 13 Javascript
js仿百度音乐全选操作
Jan 13 Javascript
jquery插件ContextMenu设置右键菜单
Mar 13 Javascript
H5实现仿flash效果的实现代码
Sep 29 Javascript
Canvas实现微信红包照片效果
Aug 21 Javascript
react native 获取地理位置的方法示例
Aug 28 Javascript
深入理解Vue 的钩子函数
Sep 05 Javascript
PHP读取远程txt文档到数组并实现遍历
Aug 25 Javascript
vue的webcamjs集成方式
Nov 16 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
PHP个人网站架设连环讲(二)
2006/10/09 PHP
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
vant实现购物车功能
2020/06/29 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
python基础教程之lambda表达式使用方法
2014/02/12 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
趣味活动策划方案
2014/02/08 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
一般纳税人申请报告
2015/05/18 职场文书
法律服务所工作总结
2015/08/10 职场文书
Python+Tkinter打造签名设计工具
2022/04/01 Python