淺談Axios去除重復請求方案
此方案主要有兩個功能
1.請求發出後,後續重復請求取消不處理,等待第一次請求完成。
2.路由跳轉後,上一個頁面未完成請求全部清理。
一、取消重復請求
前置知識:
1.axios官方提供的取消方法,可以查閱相關文檔:CancelToken
2.js Map相關概念
3.安全的查詢字符串解析和字符串分解庫 qs,功能類似js自帶的JSON
為簡化參數處理,本方案隻考慮post請求,也就是如果method,url以及data相同則視為重復請求
// axios.js const pending = new Map() /** * 添加請求 * @param {Object} config **/ const addPending = (config) => { const url = [ config.method, config.url, qs.stringify(config.data) ].join('&') if (pending.has(url)) { // 如果 pending 中存在當前請求則取消後面的請求 config.cancelToken = new axios.CancelToken(cancel => cancel(`重復的請求被主動攔截: ${url}`)) } else { // 如果 pending 中不存在當前請求,則添加進去 config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => { pending.set(url, cancel) }) } } /** * 移除請求 * @param {Object} config */ const removePending = (config) => { const url = [ config.method, config.url.replace(config.baseURL, ''), // 響應url會添加域名,需要去掉與請求URL保持一致 qs.stringify(JSON.parse(config.data)) // 需要與request的參數結構保持一致,request中是對象,response中是字符串 ].join('&') if (pending.has(url)) { // 如果在 pending 中存在當前請求標識,取消當前請求,並且移除 pending.delete(url) } } /* axios全局請求參數設置,請求攔截器 */ axios.interceptors.request.use( config => { addPending(config) // 將當前請求添加到 pending 中 return config }, error => { return Promise.reject(error) } ) // 響應攔截器即異常處理 axios.interceptors.response.use( response => { removePending(response.config) // 在請求結束後,移除本次請求 return response }, err => { if (err && err.config) { removePending(err.config) // 在請求結束後,移除本次請求 } return Promise.resolve(err.response) } )
二、清理所有請求
// axios.js /** * 清空 pending 中的請求(在路由跳轉時調用) */ export const clearPending = () => { for (const [url, cancel] of pending) { cancel(url) } pending.clear() }
// router.js router.beforeEach((to, from, next) => { // 路由跳轉,清除所有請求 clearPending() })
到此這篇關於Axios去除重復請求方案的文章就介紹到這瞭,更多相關Axios去除重復請求方案內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!