淺談Axios去除重復(fù)請(qǐng)求方案
此方案主要有兩個(gè)功能
1.請(qǐng)求發(fā)出后,后續(xù)重復(fù)請(qǐng)求取消不處理,等待第一次請(qǐng)求完成。
2.路由跳轉(zhuǎn)后,上一個(gè)頁面未完成請(qǐng)求全部清理。
一、取消重復(fù)請(qǐng)求
前置知識(shí):
1.axios官方提供的取消方法,可以查閱相關(guān)文檔:CancelToken
2.js Map相關(guān)概念
3.安全的查詢字符串解析和字符串分解庫 qs,功能類似js自帶的JSON
為簡(jiǎn)化參數(shù)處理,本方案只考慮post請(qǐng)求,也就是如果method,url以及data相同則視為重復(fù)請(qǐng)求
// axios.js const pending = new Map() /** * 添加請(qǐng)求 * @param {Object} config **/ const addPending = (config) => { const url = [ config.method, config.url, qs.stringify(config.data) ].join('&') if (pending.has(url)) { // 如果 pending 中存在當(dāng)前請(qǐng)求則取消后面的請(qǐng)求 config.cancelToken = new axios.CancelToken(cancel => cancel(`重復(fù)的請(qǐng)求被主動(dòng)攔截: ${url}`)) } else { // 如果 pending 中不存在當(dāng)前請(qǐng)求,則添加進(jìn)去 config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => { pending.set(url, cancel) }) } } /** * 移除請(qǐng)求 * @param {Object} config */ const removePending = (config) => { const url = [ config.method, config.url.replace(config.baseURL, ''), // 響應(yīng)url會(huì)添加域名,需要去掉與請(qǐng)求URL保持一致 qs.stringify(JSON.parse(config.data)) // 需要與request的參數(shù)結(jié)構(gòu)保持一致,request中是對(duì)象,response中是字符串 ].join('&') if (pending.has(url)) { // 如果在 pending 中存在當(dāng)前請(qǐng)求標(biāo)識(shí),取消當(dāng)前請(qǐng)求,并且移除 pending.delete(url) } } /* axios全局請(qǐng)求參數(shù)設(shè)置,請(qǐng)求攔截器 */ axios.interceptors.request.use( config => { addPending(config) // 將當(dāng)前請(qǐng)求添加到 pending 中 return config }, error => { return Promise.reject(error) } ) // 響應(yīng)攔截器即異常處理 axios.interceptors.response.use( response => { removePending(response.config) // 在請(qǐng)求結(jié)束后,移除本次請(qǐng)求 return response }, err => { if (err && err.config) { removePending(err.config) // 在請(qǐng)求結(jié)束后,移除本次請(qǐng)求 } return Promise.resolve(err.response) } )
二、清理所有請(qǐng)求
// axios.js /** * 清空 pending 中的請(qǐng)求(在路由跳轉(zhuǎn)時(shí)調(diào)用) */ export const clearPending = () => { for (const [url, cancel] of pending) { cancel(url) } pending.clear() }
// router.js router.beforeEach((to, from, next) => { // 路由跳轉(zhuǎn),清除所有請(qǐng)求 clearPending() })
到此這篇關(guān)于Axios去除重復(fù)請(qǐng)求方案的文章就介紹到這了,更多相關(guān)Axios去除重復(fù)請(qǐng)求方案內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一個(gè)類似vbscript的round函數(shù)的javascript函數(shù)
同vbscript的Round函數(shù)功能相同,四舍五入保留指定小數(shù)位數(shù)2009-04-04ES6中Array.find()和findIndex()函數(shù)的用法詳解
ES6為Array增加了find(),findIndex函數(shù)。find()函數(shù)用來查找目標(biāo)元素,找到就返回該元素,找不到返回undefined,而findIndex()函數(shù)也是查找目標(biāo)元素,找到就返回元素的位置,找不到就返回-1。下面通過實(shí)例詳解,需要的朋友參考下吧2017-09-09淺談js之字面量、對(duì)象字面量的訪問、關(guān)鍵字in的用法
下面小編就為大家?guī)硪黄獪\談js之字面量、對(duì)象字面量的訪問、關(guān)鍵字in的用法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11JS實(shí)現(xiàn)圖片高亮展示效果實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)圖片高亮展示效果的方法,實(shí)例分析了JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)操作頁面元素樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11微信小程序購物商城系統(tǒng)開發(fā)系列-目錄結(jié)構(gòu)介紹
這篇文章主要介紹了微信小程序購物商城系統(tǒng)開發(fā)系列-目錄結(jié)構(gòu)介紹,有興趣的可以了解一下。2016-11-11