色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript如何實現(xiàn)防止重復(fù)的網(wǎng)絡(luò)請求的示例

瀏覽:135日期:2023-10-05 08:14:09
前言

在開發(fā)中,經(jīng)常會遇到接口重復(fù)請求導(dǎo)致的各種問題。對于重復(fù)的網(wǎng)絡(luò)請求,會導(dǎo)致頁面更新多次,發(fā)生頁面抖動的現(xiàn)象,影響用戶體驗。例如當(dāng)前頁面請求還未響應(yīng)完成,就切換到其他路由,那么這些請求直到響應(yīng)返回才會中止。無論從用戶體驗或者從業(yè)務(wù)嚴(yán)謹(jǐn)方面來說,取消無用的請求確實是需要避免的。

實現(xiàn)思路

JavaScript如何實現(xiàn)防止重復(fù)的網(wǎng)絡(luò)請求的示例

** 1.在發(fā)送請求前先攔截當(dāng)前請求地址 (url + 方法 + 參數(shù));** 2.開啟一個請求隊列用于保存 當(dāng)前地址;** 3.每次請求查看請求隊列里面有沒有當(dāng)前url地址;** 4.如果請求隊列里有當(dāng)前url地址就取消當(dāng)前請求,** 5.如果沒有就發(fā)送請求,當(dāng)請求數(shù)據(jù)返回后,請求隊列里清除當(dāng)前url地址。

1.平時我們寫接口是這樣的:

請求接口文件

import { http } from ’@/plugin/axios’; // 導(dǎo)入請求接口 http// 初始化export function getInit(params) { return http({ method: ’get’, url: ’/xxx/xxx/xx’, params, });}

主要就是這里執(zhí)行 http方法的時候做操作;執(zhí)行http函數(shù)的時候能獲取到請求所有配置 config ,返回promise對象。

2.這里演示使用axios,思路是執(zhí)行請求函數(shù)的時候外面包一層

axios.js配置文件

import axios from ’axios’;import { httpRequest, completeRequest } from ’./options’; // 這里就是我們要實現(xiàn)的邏輯文件// 里面做一些請求攔截,響應(yīng)攔截操作 具體查看axios文檔const service = axios.create({ baseURL: ’xxx/xxx’,});// 請求攔截器service.interceptors.request.use(config => {}, error => {})// 響應(yīng)攔截器service.interceptors.response.use(response => { completeRequest(response); // 2.響應(yīng)請求回來執(zhí)行}, error => { })export function http(config) { // => 這里config就是傳遞的請求配置參數(shù) return httpRequest(config, service); // + 1.在這里做一些邏輯操作}3.防止重復(fù)網(wǎng)絡(luò)配置文件

options.js(1)發(fā)送請求前,查看請求隊列里是否有當(dāng)前請求(url地址來判斷)

請求隊列有當(dāng)前url地址, 取消請求 返回promise.reject失敗 沒有當(dāng)前請求,正常發(fā)送請求;

/** * 職責(zé): 防止重復(fù)的網(wǎng)絡(luò)請求 * */let list = new Set(); // 1.請求隊列// 合并 方法 參數(shù) url地址function getUrl(config = {}) { // get請求 params參數(shù) post請求 data參數(shù), baseURL const { url, method, params, data, baseURL = ’’ } = config; const urlVal = url.replace(baseURL, ’’); return `${urlVal}?${method === ’get’ ? getformatObjVal(params) : getformatObjVal(data)}`;}// 處理 url地址 const getformatObjVal = (obj) => { obj = typeof obj === ’string’ ? JSON.parse(`${obj}`) : obj; var str = []; for (let p in obj) { if (obj.hasOwnProperty(p) && p !== ’_t’) { var item = obj[p] === null ? ’’ : obj[p]; // 處理null str.push(encodeURIComponent(p) + ’=’ + encodeURIComponent(item)); } } return str.join(’&’);}// 2.請求方法export function httpRequest(config = {}, axios) { const url = getUrl(config); //3. 這里我們獲取到了URL地址 if (list.has(url)) { // 4.查看請求隊列是否有當(dāng)前url地址 return Promise.reject(’In the request’); // 5.在請求隊列里面 取消當(dāng)前請求, 返回Promise失敗結(jié)果 } // 6. 請求隊列沒有當(dāng)前url地址 發(fā)送請求并把url地址存入請求隊列里 list.add(url); return Promise.resolve(axios); }

(2)請求響應(yīng)回來后,在請求隊列里刪除當(dāng)前url地址; (下一次請求就可以正常發(fā)送)​ options.js

// 請求響應(yīng)回來執(zhí)行這個函數(shù)export function completeRequest(response = {}) { const { config } = response; // 1.response里面config能拿到配置參數(shù) const url = getUrl(config); // 2.獲取url地址 if (list.has(url)) { list.delete(url); // 3.刪除請求隊列中的當(dāng)前請求url地址 }}

axios.js

import axios from ’axios’;import { httpRequest, completeRequest } from ’./options’; // 防止重復(fù)請求const service = axios.create({ baseURL: ’xxx/xxx’,});// 請求攔截器service.interceptors.request.use(config => {}, error => {})// 響應(yīng)攔截器service.interceptors.response.use(response => { completeRequest(response); // 2.響應(yīng)請求回來執(zhí)行 +}, error => { })// 導(dǎo)出請求export function http(config) { return httpRequest(config, service); // 1.發(fā)送請求前執(zhí)行}

到這里已經(jīng)實現(xiàn)了防止重復(fù)的網(wǎng)絡(luò)請求,但還有一個問題,響應(yīng)請求發(fā)生異常了要清除請求隊列中當(dāng)前url地址。不清理,下一次發(fā)送請求直接被取消掉 (這里我就隨便寫了一個方法,把請求隊列全部清空,大家可以按自己場景來寫)。

/** * 清空所有請求隊列 */export function clearRequestList() { list = new Set(); // 這里我就直接清空了}

完整http.js文件

import axios from ’axios’;import { httpRequest, completeRequest, clearRequestList } from ’./options’; // 防止重復(fù)請求 +const service = axios.create({ baseURL: ’xxx/xxx’,});// 請求攔截器service.interceptors.request.use(config => {}, error => {})// 響應(yīng)攔截器service.interceptors.response.use(response => { completeRequest(response); // 2.響應(yīng)請求回來執(zhí)行}, error => { clearRequestList(); // + })// 導(dǎo)出請求export function http(config) { return httpRequest(config, service); // 1.發(fā)送請求前執(zhí)行}

完整options.js

/** * 職責(zé): 防止重復(fù)的網(wǎng)絡(luò)請求 * */let list = new Set(); // 1.請求隊列// 合并 方法 參數(shù) url地址function getUrl(config = {}) { // get請求 params參數(shù) post請求 data參數(shù), baseURL const { url, method, params, baseURL = ’’ } = config; const urlVal = url.replace(baseURL, ’’); return `${urlVal}?${method === ’get’ ? getformatObjVal(params) : ’post’}`;}// 處理 url地址 const getformatObjVal = (obj) => { obj = typeof obj === ’string’ ? JSON.parse(`${obj}`) : obj; var str = []; for (let p in obj) { if (obj.hasOwnProperty(p) && p !== ’_t’) { var item = obj[p] === null ? ’’ : obj[p]; // 處理null str.push(encodeURIComponent(p) + ’=’ + encodeURIComponent(item)); } } return str.join(’&’);}// 2.請求方法export function httpRequest(config = {}, axios) { const url = getUrl(config); //3. 這里我們獲取到了URL地址 if (list.has(url)) { // 4.查看請求隊列是否有當(dāng)前url地址 return Promise.reject(’In the request’); // 5.在請求隊列里面 取消當(dāng)前請求, 返回Promise失敗結(jié)果 } // 6. 請求隊列沒有當(dāng)前url地址 發(fā)送請求并把url地址存入請求隊列里 list.add(url); return Promise.resolve(axios);}/** * 請求響應(yīng)回來執(zhí)行這個函數(shù) */export function completeRequest(response = {}) { const { config } = response; // 1.response里面config能拿到配置參數(shù) const url = getUrl(config); // 2.獲取url地址 list.has(url) && list.delete(url); // 3.刪除請求隊列中的當(dāng)前請求url地址}/** * 清空所有請求隊列 */export function clearRequestList(error) { // error 可以獲取到配置, 做一些操作。 list = new Set(); // 這里我就直接清空了}

以上就是我實現(xiàn)防止網(wǎng)絡(luò)請求的方式,之前我有使用過axios中CancelToken來進(jìn)行取消請求;當(dāng)會有一些問題。

需要配置請求文件,不友好,團(tuán)隊開發(fā)配置也比較麻煩。 需要給每個請求都配置CancelToken。 有兩個方法使用它 具體可以參考官網(wǎng)文檔

到此這篇關(guān)于JavaScript如何實現(xiàn)防止重復(fù)的網(wǎng)絡(luò)請求的示例的文章就介紹到這了,更多相關(guān)JavaScript 防止重復(fù)的網(wǎng)絡(luò)請求內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产1区在线观看 | 精品久久久久久久久久香蕉 | 亚洲视频精品在线 | 亚洲精品不卡在线 | 欧美亚洲国产日韩一区二区三区 | 亚洲欧美日韩国产一区二区精品 | 日本精品高清一区二区2021 | 男女午夜性爽快免费视频不卡 | 国产亚洲人成网站在线观看 | 国产在线观看免费人成小说 | 亚洲精品久久精品h成人 | 久草在线资源 | 亚洲欧美日韩三级 | 国产美女做爰免费视 | 最新欧美精品一区二区三区不卡 | 全部aⅴ极品视觉盛宴精品 全部免费a级毛片 | 男人操美女网站 | 午夜影院0606 | 国产精品久久久久久一区二区 | 国产精品jvid在线观看 | 中文字幕一区中文亚洲 | 毛片免费在线 | 成人亚洲精品一区二区 | 亚洲午夜精品在线 | 免费视频一区二区三区四区 | 草草影院www色极品欧美 | 亚洲成人免费在线视频 | 亚洲天堂男人天堂 | 亚洲国产欧美视频 | 国内自拍视频一区二区三区 | 国产原创自拍 | 69成人做爰视频69 | 亚洲视频在线免费播放 | 国产精品免费视频能看 | 99精品视频在线播放2 | 欧美日韩 在线播放 | 国产视频一二三 | 美女很黄很黄是免费的·无遮挡网站 | 好妞操| 中国胖女人一级毛片aaaaa | 草草日 |