vue+typescript封装axios,实现取消重复请求

2023-11-15

vue-cli3可以直接生成vue+typescript项目,然后对axios进行封装,实现拦截多次重复请求,并取消。
直接撸代码(也是借鉴网上的,做了修改)

  1. 在根目录下新建axios.tool.ts文件
import Vue from 'vue';
import router from './router';
import axios from 'axios';
import qs from 'qs';
import { Base } from './base'; // 导入全局环境变量
const base = new Base();
// 取消请求
const CancelToken = axios.CancelToken;
// 是否需要拦截code==-1的状态
let is_log: boolean = false;
// 设置默认请求头
axios.defaults.headers = {
    'X-Requested-With': 'XMLHttpRequest',
    'Content-Type': 'application/x-www-form-urlencoded',
};
axios.defaults.baseURL = base.url();
// 请求超时的时间限制
axios.defaults.timeout = 20000;
// 开始设置请求 发起的拦截处理
// config 代表发起请求的参数的实体
let requestName: any;
axios.interceptors.request.use((config: any) => {
    // 得到参数中的 requestName 字段,用于决定下次发起请求,取消对应的 相同字段的请求
    // 如果没有 requestName 就默认添加一个 不同的时间戳
    if (config.method === 'post') {
        if (config.data && qs.parse(config.data).requestName) {
            requestName = qs.parse(config.data).requestName;
        } else {
            requestName = new Date().getTime();
        }
        if (config.data.indexOf('is_log') !== -1) {
            is_log = true;
        }
    } else {
        if (config.params && config.params.requestName) {
            requestName = config.params.requestName;
        } else {
            requestName = new Date().getTime();
        }
        if (config.params.is_log) {
            is_log = true;
        }
    }
    // 判断,如果这里拿到的参数中的 requestName 在上一次请求中已经存在,就取消上一次的请求
    if (requestName) {
        if (axios[requestName] && axios[requestName].cancel) {
            axios[requestName].cancel('取消了请求');
        }
        config.cancelToken = new CancelToken( (c: any) => {
            axios[requestName] = {};
            axios[requestName].cancel = c;
        });
    }
    return config;
}, (error: any) => {
    return Promise.reject(error);
});

// 请求到结果的拦截处理
axios.interceptors.response.use( (config: any) => {
    // 返回请求正确的结果
    if ((!is_log) && config.data.code === -1) {
        router.push({path: '/login'});  // 进入登陆页面
    }
    if (config.data.code === -2) {
        router.push({path: '/'}); // 进入实名认证
    }
    return config.data;
}, (error: any) => {
    return Promise.reject(error);
    // 错误的请求结果处理,这里的代码根据后台的状态码来决定错误的输出信息
});
// 将axios 的 post 方法,绑定到 vue 实例上面的 $post
Vue.prototype.$post =  (url: any, params: any) => {
    return new Promise((resolve, reject) => {
        axios.post(url, qs.stringify(params)).then((res: any) => {
            resolve(res);
        }).catch((err: any) => {
            reject(err);
         });
     });
};
// 将axios 的 get 方法,绑定到 vue 实例上面的 $get
Vue.prototype.$get =  (url: any, params: any) => {
    return new Promise((resolve, reject) => {
        axios.get(url, { params: params }).then((res: any) => {
            resolve(res); // 返回请求成功的数据 data
        }).catch((err: any) => {
            reject(err);
        });
    });
};
  1. 在shims-vue.d.ts中声明qs模块,因为axios中没有qs的ts文件暴露
declare module 'qs' {
  const qs: any;
  export default qs;
}
  1. 在main.ts中引入
import './axios.tool'; // 导入封装好的axios
  1. 在vue组件中使用
 this.$get("/userMessageAssociation/isRead", { is_log: true , requestName: 'get'}).then( (res: any) => {
    console.log(res);
 });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+typescript封装axios,实现取消重复请求 的相关文章

随机推荐

  • DRM驱动程序开发思路和实践

    DRM驱动程序开发思路和实践 DRM Direct Rendering Manager 是Linux内核中的一个模块 用于管理GPU的渲染功能 在开发Linux下的图形驱动程序时 我们需要使用DRM模块作为基础 通过它来访问GPU的硬件资源
  • 20K测试工程师面试会考察哪些能力?

    前言 今年刚接触了 功能 测试工程师的面试工作 有遇到对信贷业务流程较熟悉的 工作内容纯测试app功能的 什么都接触过但是不够深入的 发现简历上写的东西和实际真的有点差距 面试也是一个艺术活 为了更好地考察面试者的能力 让面试工作更加有条理
  • switch更新主机服务器维护,switch更新链接不到服务器

    switch更新链接不到服务器 内容精选 换一换 客户在云容器引擎上搭建服务为手机应用订阅信息 首先客户端会向部署在CCE集群上的服务端 redis 发起请求 成功订阅信息服务 后继服务端侧会定时推送订阅的消息给客户端 服务端部署后 第一次
  • 编译cm for nexus5

    dependence bison build essential curl flex git gnupg gperf libesd0 dev liblz4 tool libncurses5 dev libsdl1 2 dev libwxgt
  • C++中派生类对基类成员的三种访问规则

    C 中派生类对基类成员的访问形式主要有以下两种 1 内部访问 由派生类中新增成员对基类继承来的成员的访问 2 对象访问 在派生类外部 通过派生类的对象对从基类继承来的成员的访问 今天给大家介绍在3中继承方式下 派生类对基类成员的访问规则 1
  • leetcode 27-移除元素 python

    给定一个数组 nums 和一个值 val 你需要原地移除所有数值等于 val 的元素 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成 元素的顺序可以改变 你不需要考虑数组中超出
  • require用法

    现在前端的页面都采用模块化来加载js 避免了js加载的延迟顺序依赖等问题 原理的东西这里不多做解释 我们这节只是介绍一下require的用法 1 首先我们要下载require js文件 2 html引入 这里src是require js的路
  • Netty实时接收数据放入缓存处理简单示例

    因为硬件设备使用的udp协议 传输数据 客户端只顾着发数据 所以大部分操作都在我服务端进行操作 做到数据实时 定义为每秒客户端发送来一次数据 展示 暂定方案为netty redis map netty这块我就不多赘述了 不懂得可以先看net
  • 创建Spring Boot框架项目- maven工程--多种方式

    文章目录 创建Maven工程的方式有很多种 以下简单介绍三种 使用Maven Spring Initializr 2 1选择默认方式 1 gt 默认方式 2 gt 但是有可能加载不出来因为用的国外的网址 3 gt 有时候也会加载出来 4 g
  • TypeError: "x" is not a constructor 无厘头使用 vuex 的坑

    2019 11 25 写 vuex store js 的时候 因为 export default new Vuex store store 给了个小写 所以爆出了一个 vuex a store is not a constructor 的错
  • Python提取ABAQUS结果数据

    背景介绍 调研发现 传统结构设计过程中需要依赖工程师的理论知识和工程经验 针对具体问题提出初步设计方案 后续通过多次的迭代优化 直到满足要求为止 这种传统设计方法不仅工作量大 效率低 企业还需要投入巨量的成本 因此 我们可以通过优化算法 有
  • LLVM系列第十章:控制流语句if-else-phi

    系列文章目录 LLVM系列第一章 编译LLVM源码 LLVM系列第二章 模块Module LLVM系列第三章 函数Function LLVM系列第四章 逻辑代码块Block LLVM系列第五章 全局变量Global Variable LLV
  • jsp&servlet&jdbc&mysql实现简单的增删查改(一)

    1 关于JDBC JDBC Java DataBase Connectivity 是一种用于执行SQL语句的Java API 是Java和数据库之间的一个桥梁 它由一组用Java语言编写的类和接口组成 各种不同类型的数据库都有相应的实现类
  • MathCAD14破解版

    MathCAD14 是美国的PTC公司研发推广的一款老牌的工程计算软件 也可以说是一种交互式数值计算系统 只要输入一个数学公式或者方程组或者矩阵都可以通过该软件直接得出结果 它拥有五个扩展库 求解与优化 数据分析 信号处理 图像处理 和小波
  • 如何写好一份软件开发设计文档

    设计文档 也被称作技术规范和实现手册 描述了你如何去解决一个问题 是确保正确完成工作最有用的工具 其目的是迫使你对设计展开缜密的思考 并收集他人的反馈 进而完善你的想法 同时在软件交付和交接的过程中 能让其他人更通俗易懂的了解之前的设计目的
  • 【Python小技巧】.py .pyd .pyw 都是干什么用文件?想分发时加密py脚本文件?

    文章目录 前言 一 什么是 py 文件 二 什么是 pyd 文件 pyd 文件是用 Python 编程语言编写的 是通过编译 Python 代码生成的 py 和 pyd 文件格式之间的区别 如何创建 pyd 文件 如何使用 pyd文件 三
  • Android USB电源管理

    The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host 1 驱动shutdown顺序 系
  • 黑盒测试方法:边界值分析具体步骤及实例

    边界值分析法也是黑盒测试方法之一 强调测试边界条件 而非等量类划分 其过程是确定输入值的最大值和最小值 然后将测试点置于这些极端值以及它们之间 使用边界值分析法可以揭示程序在处于边界条件时的bug 并能够更有效地完成测试工作 以下是该方法的
  • TypeError: defineConfig is not a function

    场景 当我们在做打包配置的时候 出现如下错误 原因 由于用vue cli直接创建了vue 3的项目 而里面的生态并非都是最新版 vue config js中的代码如下 使用了vue 3的语法 解决 输入 vue upgrade 一路向下 即
  • vue+typescript封装axios,实现取消重复请求

    vue cli3可以直接生成vue typescript项目 然后对axios进行封装 实现拦截多次重复请求 并取消 直接撸代码 也是借鉴网上的 做了修改 在根目录下新建axios tool ts文件 import Vue from vue