Vue axios库避免重复发送请求的示例介绍

 更新时间:2023年02月15日 09:14:35   作者:阿选不出来  
Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中。axios是目前最优秀的HTTP请求库之一,我们封装axios请求也是为了让代码看的更加清晰,后期好维护

目的

  • 实现请求拦截
  • 实现响应拦截
  • 常见错误处理
  • 不能请求头设置
  • api 集中式管理

(取消重复请求,重复发送请求, 请求缓存等情况均还未实现)

文件结构

实现

index.js内代码如下:

引入

// 引入 axios
import axios from 'axios';
// 请求配置单独写一个文件 baseurl.js
import serverConfig from './baseurl.js'

创建一个实例

const serviceAxios = axios.creat({
	baseURL: serverConfig.baseURL, //基础请求地址
    timeout: 1000 , //请求超时设置
    withCredentials: false, // 跨域请求是否需要携带 cookie 
})

请求拦截

serviceAxios.interceptors.request.use(
    (config) => {
        console.log("请求配置", config);
        // 是否使用 Token, 
        if(serverConfig.useTokenAuthorization) {
            config.headers["Authorization"] = localStorage.getItem("token");
        }
        // 设置请求头
        if(config.method === "post") {
            config.headers["content-type"] = "application/x-ww-form-urlencoded";
            // config.data = qs.stringify(config.data); //序列化  效果等同于下行代码
            config.requestType = "form"
        } else {
            config.headers["content-type"] = "application/json"
        }
        // 返回
        return config
    },
    (error) => {
        Promise.reject(error)
    }
)

响应拦截

serviceAxios.interceptors.response.use(
    (res) => {
        console.log("响应拦截", res);
        let data = res.data;
        // 处理自己的业务逻辑,如 token 是否过期...
        return data;
    },
    (error) => {
        let message = ""
        if(error && error.response) {
            switch (error.response.status) {
                case 302: 
                    message = "接口重定向了! ";
                    break;
                case 400:
                    message = "参数不正确! ";
                    break;
                case 401:
                    message = "您未登录, 或者登录已经超时, 请先登录! "
                    break;
                case 403:
                    message = "您还没有权限操作! ";
                    break;
                case 404:
                    message = `请求地址出错: ${error.response.config.url}`;
                    break;
                case 408:
                    message = "请求超时! ";
                    break;
                case 409:
                    message = "系统已存在相同数据! "
                    break;
                case 500:
                    message = "服务器内部错误! "
                    break;
                case 501:
                    message = "服务未实现! "
                    break;
                case 502:
                    message = "回答错误! "
                    break;
                case 503:
                    message = "服务不可用"
                    break;
                case 504:
                    message = "服务暂时无法访问, 请稍后再试"
                    break;
                case 505:
                    message = "HTTP 版本不受支持! "
                    break;
                default:
                    message = "异常问题, 请联系管理员! "
                    break;
            }
        }
        return Promise.reject(message);
    }
);

取消重复发送请求

实现思想

唯一标识值 : 每次发起请求的时候根据请求的方式,请求URL,请求携带参数设置一个唯一标识值.

请求队列: 创建一个map对象储存请求的唯一标识值.

每次发送请求的时候, 在请求拦截中判断请求队列中是否存在这个请求, 存在就说明这个请求正在进行中,那么就取消正在发送的请求,重新发送请求; 不存在就将本次请求加入请求队列中.

在响应拦截中将本次请求从请求队列中移除.

📘生成唯一标识值函数

import qs from 'qs'
function regsoleKey(config){
    const {method, url, params, data } = config;
    return [method, url, qs.stringify(params), qs.stringify(data)].join('&')
}

📘将请求加入请求队列函数

const reqQueue = new Map();
function addreqQueue(config){
    //调用生成唯一标识值函数, 生成 requestKey
    const requestKey = regsoleKey(config);
    //为每个请求创建一个专属的 CancelToken(用于取消请求)
    config.cancelToken = config.cancelToken || new axios.CancelToken((cancel)=>{
        // 判断 reqQueue 中是否含有 requestKey, 
        // 将 requestKey 与 CancelToken 以键值对的形式保存到map对象中
        if(!reqQueue.has(requestKey)){
            reqQueue.set(requestKey,cancel)
        }
    });
}

📘将请求从请求队列移除

function removereqQueue(config){
    // 标识值
    const requestKey = generateReqKey(config);
    if(reqQueue.has(requestKey)){
        // 取消之前发出请求
       const cancelToken = reqQueue.get(requestKey);
       cancelToken(requestKey);
        // 从队列移除
       reqQueue.delete(requestKey);
    }
}

💧请求拦截器

serviceAxios.interceptors.request.use(
	function(config) {
		removereqQueue(config); // 检查是否重复发送请求
		addreqQueue(config); //将本次请求加入请求队列
		return config
	},
	(error) => {
		return Promise.reject(error)
	}
)

💧响应拦截器

serviceAxios.interceptors.response.use(
	(res) => {
		removereqQueue(res.config); //请求从请求队列移除
		return res
	},
	(error) => {
		removereqQueue(error.config || {}); //请求从请求队列移除
		//....
	}
)
// 最后export default serviceAxios

baseurl.js代码如下

const serverConfig = {
    baseURL: 'https://fm-emo-music-api.vercel.app',
    useTokenAuthorization: true, //是否开启 token 验证
}
export default serverConfig

api.js代码如下

// 引入index.js
import serviceAxios from './index.js'
// get实例
export const VideoRecommendLike = (params) => {
    return serviceAxios({
        method: "get",
        url: "/dj/personalize/recommend",
        params,
    })
}
// post实例
export const ConfirmPhone = (data) =>{
    return serviceAxios({
        method: "post",
        url: "/captcha/sent",
        data,
    })
}

调用

如何在原生js文件内调用?

首先引入axios文件

    <!-- axios请求文件 -->
    <script src="/src/utils/axios.js"></script>

再引入带有axios请求的js文件, 请求文件内使用es6新语法按需引入api.js文件

例:

import {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->useRouter} from '../../router/app.js'

如何在Vue文件内使用?

示例:

  // 按需引入请求接口
    import {emailCounts} from "@/api/api.js"
    export default {
    	...
    	// 异步进行axios请求
    	methods: {
    		async comein(){
    			let res = await emailCount(params)
    			console.log(res)
    		}
		}
    }

到此这篇关于Vue axios库避免重复发送请求的示例介绍的文章就介绍到这了,更多相关Vue避免重复发送请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 10分钟快速上手VueRouter4.x教程

    10分钟快速上手VueRouter4.x教程

    Vue Router目前最新版本是4.X,本文主要主要介绍了10分钟快速上手VueRouter4.x教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue实现简单实时汇率计算功能

    vue实现简单实时汇率计算功能

    这篇文章主要为大家详细介绍了vue实现简单实时汇率计算功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Vue 项目运行完成后自动打开浏览器的方法汇总

    Vue 项目运行完成后自动打开浏览器的方法汇总

    这篇文章主要介绍了Vue 项目运行完成后自动打开浏览器的多种实现方法,方法一比较适用于vue3,每种方法通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-02-02
  • Vue中如何运用TS语法

    Vue中如何运用TS语法

    本文主要介绍了Vue中如何运用TS语法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Vue.2.0.5过渡效果使用技巧

    Vue.2.0.5过渡效果使用技巧

    这篇文章主要介绍了Vue.2.0.5过渡效果使用技巧,实例分析了Vue.2.0.5过渡效果的技巧,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • vue中用qrcode库将超链接生成二维码图片的示例代码

    vue中用qrcode库将超链接生成二维码图片的示例代码

    生成二维码是一种常见的需求,无论是用于商业宣传还是个人分享,二维码都可以提供快速方便的方式来传递信息,在Vue框架中,我们可以使用qrcode库来轻松地生成二维码,本篇博文将介绍如何安装qrcode库,并通过一个实际例子来展示如何生成二维码,需要的朋友可以参考下
    2023-12-12
  • 关于下拉类型多选组件Vue-Treeselect(键名转换)

    关于下拉类型多选组件Vue-Treeselect(键名转换)

    这篇文章主要介绍了关于下拉类型多选组件Vue-Treeselect(键名转换),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue+eslint+vscode配置教程

    vue+eslint+vscode配置教程

    这篇文章主要介绍了vue+eslint+vscode配置教程,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Vue3获取和操作DOM元素的项目实践

    Vue3获取和操作DOM元素的项目实践

    在Vue3中,有时我们需要直接操作DOM节点,本文主要介绍了Vue3获取和操作DOM元素的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Vue 滚动行为的具体使用方法

    Vue 滚动行为的具体使用方法

    本篇文章主要介绍了Vue 滚动行为的具体使用方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论