详解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 相关文章推荐
js实现页面跳转重定向的几种方式
May 29 Javascript
javascript实现动态模态绑定grid过程代码
Sep 22 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
Aug 24 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
Oct 27 Javascript
javascript基础知识讲解
Jan 11 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
vue 巧用过渡效果(小结)
Sep 22 Javascript
vue搜索和vue模糊搜索代码实例
May 07 Javascript
vue中get请求如何传递数组参数的方法示例
Nov 08 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
解决在Vue中使用axios POST请求变成OPTIONS的问题
Aug 14 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
解析yii数据库的增删查改
2013/06/20 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
php微信开发接入
2016/08/27 PHP
laravel自定义分页效果
2017/07/23 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
python组合无重复三位数的实例
2018/11/13 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Pytorch中.new()的作用详解
2020/02/18 Python
学习Python爬虫的几点建议
2020/08/05 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
通用C#笔试题附答案
2016/11/26 面试题
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
建设工程授权委托书
2014/09/22 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL