详解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 相关文章推荐
双击滚屏-常用推荐
Nov 29 Javascript
JS自动适应的图片弹窗实例
Jun 29 Javascript
js中创建对象的几种方式示例介绍
Jan 26 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
Jul 02 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
JavaScript中的条件判断语句使用详解
Jun 03 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
浅谈js中几种实用的跨域方法原理详解
Dec 02 Javascript
jQuery实现标签页效果实战(4)
Feb 08 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 Javascript
JS如何使用剪贴板操作Clipboard API
May 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
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
tagName的使用,留一笔
2006/06/26 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
几种tab切换详解
2017/02/03 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
使用Node.js搭建静态资源服务详细教程
2017/08/02 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
js实现简单点赞操作
2020/03/17 Javascript
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
Python切片操作实例分析
2018/03/16 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
优秀士兵个人事迹材料
2014/01/19 职场文书
小学生家长评语集锦
2014/01/30 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
技能比武方案
2014/05/21 职场文书
优秀应届生求职信
2014/06/16 职场文书
检讨书范文500字
2015/01/28 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
Django项目如何正确配置日志(logging)
2021/04/29 Python
golang 实现时间戳和时间的转化
2021/05/07 Golang
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
go goroutine 怎样进行错误处理
2021/07/16 Golang
MySQL读取JSON转换的方式
2022/03/18 MySQL
使用scrapy实现增量式爬取方式
2022/06/21 Python