Vue axios庫(kù)避免重復(fù)發(fā)送請(qǐng)求的示例介紹
目的
- 實(shí)現(xiàn)請(qǐng)求攔截
- 實(shí)現(xiàn)響應(yīng)攔截
- 常見(jiàn)錯(cuò)誤處理
- 不能請(qǐng)求頭設(shè)置
- api 集中式管理
(取消重復(fù)請(qǐng)求,重復(fù)發(fā)送請(qǐng)求, 請(qǐng)求緩存等情況均還未實(shí)現(xiàn))
文件結(jié)構(gòu)

實(shí)現(xiàn)
index.js內(nèi)代碼如下:
引入
// 引入 axios import axios from 'axios'; // 請(qǐng)求配置單獨(dú)寫(xiě)一個(gè)文件 baseurl.js import serverConfig from './baseurl.js'
創(chuàng)建一個(gè)實(shí)例
const serviceAxios = axios.creat({
baseURL: serverConfig.baseURL, //基礎(chǔ)請(qǐng)求地址
timeout: 1000 , //請(qǐng)求超時(shí)設(shè)置
withCredentials: false, // 跨域請(qǐng)求是否需要攜帶 cookie
})
請(qǐng)求攔截
serviceAxios.interceptors.request.use(
(config) => {
console.log("請(qǐng)求配置", config);
// 是否使用 Token,
if(serverConfig.useTokenAuthorization) {
config.headers["Authorization"] = localStorage.getItem("token");
}
// 設(shè)置請(qǐng)求頭
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)
}
)
響應(yīng)攔截
serviceAxios.interceptors.response.use(
(res) => {
console.log("響應(yīng)攔截", res);
let data = res.data;
// 處理自己的業(yè)務(wù)邏輯,如 token 是否過(guò)期...
return data;
},
(error) => {
let message = ""
if(error && error.response) {
switch (error.response.status) {
case 302:
message = "接口重定向了! ";
break;
case 400:
message = "參數(shù)不正確! ";
break;
case 401:
message = "您未登錄, 或者登錄已經(jīng)超時(shí), 請(qǐng)先登錄! "
break;
case 403:
message = "您還沒(méi)有權(quán)限操作! ";
break;
case 404:
message = `請(qǐng)求地址出錯(cuò): ${error.response.config.url}`;
break;
case 408:
message = "請(qǐng)求超時(shí)! ";
break;
case 409:
message = "系統(tǒng)已存在相同數(shù)據(jù)! "
break;
case 500:
message = "服務(wù)器內(nèi)部錯(cuò)誤! "
break;
case 501:
message = "服務(wù)未實(shí)現(xiàn)! "
break;
case 502:
message = "回答錯(cuò)誤! "
break;
case 503:
message = "服務(wù)不可用"
break;
case 504:
message = "服務(wù)暫時(shí)無(wú)法訪問(wèn), 請(qǐng)稍后再試"
break;
case 505:
message = "HTTP 版本不受支持! "
break;
default:
message = "異常問(wèn)題, 請(qǐng)聯(lián)系管理員! "
break;
}
}
return Promise.reject(message);
}
);
取消重復(fù)發(fā)送請(qǐng)求
實(shí)現(xiàn)思想
唯一標(biāo)識(shí)值 : 每次發(fā)起請(qǐng)求的時(shí)候根據(jù)請(qǐng)求的方式,請(qǐng)求URL,請(qǐng)求攜帶參數(shù)設(shè)置一個(gè)唯一標(biāo)識(shí)值.
請(qǐng)求隊(duì)列: 創(chuàng)建一個(gè)map對(duì)象儲(chǔ)存請(qǐng)求的唯一標(biāo)識(shí)值.
每次發(fā)送請(qǐng)求的時(shí)候, 在請(qǐng)求攔截中判斷請(qǐng)求隊(duì)列中是否存在這個(gè)請(qǐng)求, 存在就說(shuō)明這個(gè)請(qǐng)求正在進(jìn)行中,那么就取消正在發(fā)送的請(qǐng)求,重新發(fā)送請(qǐng)求; 不存在就將本次請(qǐng)求加入請(qǐng)求隊(duì)列中.
在響應(yīng)攔截中將本次請(qǐng)求從請(qǐng)求隊(duì)列中移除.
??生成唯一標(biāo)識(shí)值函數(shù)
import qs from 'qs'
function regsoleKey(config){
const {method, url, params, data } = config;
return [method, url, qs.stringify(params), qs.stringify(data)].join('&')
}
??將請(qǐng)求加入請(qǐng)求隊(duì)列函數(shù)
const reqQueue = new Map();
function addreqQueue(config){
//調(diào)用生成唯一標(biāo)識(shí)值函數(shù), 生成 requestKey
const requestKey = regsoleKey(config);
//為每個(gè)請(qǐng)求創(chuàng)建一個(gè)專屬的 CancelToken(用于取消請(qǐng)求)
config.cancelToken = config.cancelToken || new axios.CancelToken((cancel)=>{
// 判斷 reqQueue 中是否含有 requestKey,
// 將 requestKey 與 CancelToken 以鍵值對(duì)的形式保存到map對(duì)象中
if(!reqQueue.has(requestKey)){
reqQueue.set(requestKey,cancel)
}
});
}
??將請(qǐng)求從請(qǐng)求隊(duì)列移除
function removereqQueue(config){
// 標(biāo)識(shí)值
const requestKey = generateReqKey(config);
if(reqQueue.has(requestKey)){
// 取消之前發(fā)出請(qǐng)求
const cancelToken = reqQueue.get(requestKey);
cancelToken(requestKey);
// 從隊(duì)列移除
reqQueue.delete(requestKey);
}
}
??請(qǐng)求攔截器
serviceAxios.interceptors.request.use(
function(config) {
removereqQueue(config); // 檢查是否重復(fù)發(fā)送請(qǐng)求
addreqQueue(config); //將本次請(qǐng)求加入請(qǐng)求隊(duì)列
return config
},
(error) => {
return Promise.reject(error)
}
)
??響應(yīng)攔截器
serviceAxios.interceptors.response.use(
(res) => {
removereqQueue(res.config); //請(qǐng)求從請(qǐng)求隊(duì)列移除
return res
},
(error) => {
removereqQueue(error.config || {}); //請(qǐng)求從請(qǐng)求隊(duì)列移除
//....
}
)
// 最后export default serviceAxios
baseurl.js代碼如下
const serverConfig = {
baseURL: 'https://fm-emo-music-api.vercel.app',
useTokenAuthorization: true, //是否開(kāi)啟 token 驗(yàn)證
}
export default serverConfig
api.js代碼如下
// 引入index.js
import serviceAxios from './index.js'
// get實(shí)例
export const VideoRecommendLike = (params) => {
return serviceAxios({
method: "get",
url: "/dj/personalize/recommend",
params,
})
}
// post實(shí)例
export const ConfirmPhone = (data) =>{
return serviceAxios({
method: "post",
url: "/captcha/sent",
data,
})
}
調(diào)用
如何在原生js文件內(nèi)調(diào)用?
首先引入axios文件
<!-- axios請(qǐng)求文件 -->
<script src="/src/utils/axios.js"></script>
再引入帶有axios請(qǐng)求的js文件, 請(qǐng)求文件內(nèi)使用es6新語(yǔ)法按需引入api.js文件
例:
import {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->useRouter} from '../../router/app.js'如何在Vue文件內(nèi)使用?
示例:
// 按需引入請(qǐng)求接口
import {emailCounts} from "@/api/api.js"
export default {
...
// 異步進(jìn)行axios請(qǐng)求
methods: {
async comein(){
let res = await emailCount(params)
console.log(res)
}
}
}
到此這篇關(guān)于Vue axios庫(kù)避免重復(fù)發(fā)送請(qǐng)求的示例介紹的文章就介紹到這了,更多相關(guān)Vue避免重復(fù)發(fā)送請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue 3 中使用路由參數(shù)跳轉(zhuǎn)時(shí) watch 觸發(fā)重復(fù)請(qǐng)求問(wèn)題解決
- vue?禁止重復(fù)點(diǎn)擊發(fā)送多次請(qǐng)求的實(shí)現(xiàn)
- vue阻止重復(fù)請(qǐng)求實(shí)現(xiàn)示例詳解
- Vue路由切換和Axios接口取消重復(fù)請(qǐng)求詳解
- Vue中Axios中取消請(qǐng)求及阻止重復(fù)請(qǐng)求的方法
- vue axios攔截器常用之重復(fù)請(qǐng)求取消
- vue axios重復(fù)點(diǎn)擊取消上一次請(qǐng)求封裝的方法
- Vue3 + vue-query 的重復(fù)請(qǐng)求問(wèn)題解決
相關(guān)文章
vue3使用Electron打包成exe的方法與打包報(bào)錯(cuò)解決
在前端開(kāi)發(fā)中,Electron是一種常用的工具,它允許開(kāi)發(fā)者使用Web技術(shù)構(gòu)建桌面應(yīng)用程序,本文主要介紹了vue3使用Electron打包成exe的方法與打包報(bào)錯(cuò)解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
Vue實(shí)現(xiàn)點(diǎn)擊當(dāng)前行變色
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)點(diǎn)擊當(dāng)前行變色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
vue實(shí)現(xiàn)商品詳情頁(yè)放大鏡功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)商品詳情頁(yè)放大鏡功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
vue動(dòng)態(tài)循環(huán)出的多個(gè)select出現(xiàn)過(guò)的變?yōu)閐isabled(實(shí)例代碼)
本文通過(guò)實(shí)例代碼給大家分享了vue動(dòng)態(tài)循環(huán)出的多個(gè)select出現(xiàn)過(guò)的變?yōu)閐isabled效果,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11
vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度以及省市區(qū)功能
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度以及省市區(qū)功能的相關(guān)資料,開(kāi)發(fā)中我們需要地圖定位,就是用戶輸入位置,自動(dòng)定位獲取經(jīng)緯度,需要的朋友可以參考下2023-08-08
解決vue項(xiàng)目運(yùn)行npm run serve報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決vue項(xiàng)目運(yùn)行npm run serve報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
使用Vue創(chuàng)建前后端分離項(xiàng)目的完整過(guò)程(前端部分)
這篇文章主要介紹了使用Vue.js和Node.js搭建一個(gè)前端和后端分離的項(xiàng)目,并使用VueCLI3腳手架、axios進(jìn)行HTTP請(qǐng)求、Vue-router實(shí)現(xiàn)前端路由和vuex進(jìn)行狀態(tài)管理,需要的朋友可以參考下2025-01-01
vue中使用jquery滑動(dòng)到頁(yè)面底部的實(shí)現(xiàn)方式
這篇文章主要介紹了vue中使用jquery滑動(dòng)到頁(yè)面底部的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

