Vue axios庫(kù)避免重復(fù)發(fā)送請(qǐng)求的示例介紹
目的
- 實(shí)現(xiàn)請(qǐng)求攔截
- 實(shí)現(xiàn)響應(yīng)攔截
- 常見錯(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ú)寫一個(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 是否過期... 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 = "您還沒有權(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í)無法訪問, 請(qǐng)稍后再試" break; case 505: message = "HTTP 版本不受支持! " break; default: message = "異常問題, 請(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)求, 存在就說明這個(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, //是否開啟 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新語法按需引入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使用axios發(fā)送請(qǐng)求簡(jiǎn)單實(shí)現(xiàn)代碼
- Vue?axios庫(kù)發(fā)送請(qǐng)求的示例介紹
- Vue使用axios發(fā)送請(qǐng)求并實(shí)現(xiàn)簡(jiǎn)單封裝的示例詳解
- vue項(xiàng)目使用axios發(fā)送請(qǐng)求讓ajax請(qǐng)求頭部攜帶cookie的方法
- vue中axios處理http發(fā)送請(qǐng)求的示例(Post和get)
- Vue.js實(shí)戰(zhàn)之使用Vuex + axios發(fā)送請(qǐng)求詳解
- vue-cli3.0 axios跨域請(qǐng)求代理配置方式及端口修改
- Vue3.0?axios跨域請(qǐng)求代理服務(wù)器配置方式
- Vue利用axios發(fā)送請(qǐng)求并代理請(qǐng)求的實(shí)現(xiàn)代碼
相關(guān)文章
vue實(shí)現(xiàn)簡(jiǎn)單實(shí)時(shí)匯率計(jì)算功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)單實(shí)時(shí)匯率計(jì)算功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Vue?項(xiàng)目運(yùn)行完成后自動(dòng)打開瀏覽器的方法匯總
這篇文章主要介紹了Vue?項(xiàng)目運(yùn)行完成后自動(dòng)打開瀏覽器的多種實(shí)現(xiàn)方法,方法一比較適用于vue3,每種方法通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-02-02vue中用qrcode庫(kù)將超鏈接生成二維碼圖片的示例代碼
生成二維碼是一種常見的需求,無論是用于商業(yè)宣傳還是個(gè)人分享,二維碼都可以提供快速方便的方式來傳遞信息,在Vue框架中,我們可以使用qrcode庫(kù)來輕松地生成二維碼,本篇博文將介紹如何安裝qrcode庫(kù),并通過一個(gè)實(shí)際例子來展示如何生成二維碼,需要的朋友可以參考下2023-12-12關(guān)于下拉類型多選組件Vue-Treeselect(鍵名轉(zhuǎn)換)
這篇文章主要介紹了關(guān)于下拉類型多選組件Vue-Treeselect(鍵名轉(zhuǎn)換),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Vue3獲取和操作DOM元素的項(xiàng)目實(shí)踐
在Vue3中,有時(shí)我們需要直接操作DOM節(jié)點(diǎn),本文主要介紹了Vue3獲取和操作DOM元素的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08