电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JavaScript如何實現防止重復的網絡請求的示例

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

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

實現思路

JavaScript如何實現防止重復的網絡請求的示例

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

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

請求接口文件

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

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

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

axios.js配置文件

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

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

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

/** * 職責: 防止重復的網絡請求 * */let list = new Set(); // 1.請求隊列// 合并 方法 參數 url地址function getUrl(config = {}) { // get請求 params參數 post請求 data參數, 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.查看請求隊列是否有當前url地址 return Promise.reject(’In the request’); // 5.在請求隊列里面 取消當前請求, 返回Promise失敗結果 } // 6. 請求隊列沒有當前url地址 發送請求并把url地址存入請求隊列里 list.add(url); return Promise.resolve(axios); }

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

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

axios.js

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

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

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

完整http.js文件

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

完整options.js

/** * 職責: 防止重復的網絡請求 * */let list = new Set(); // 1.請求隊列// 合并 方法 參數 url地址function getUrl(config = {}) { // get請求 params參數 post請求 data參數, 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.查看請求隊列是否有當前url地址 return Promise.reject(’In the request’); // 5.在請求隊列里面 取消當前請求, 返回Promise失敗結果 } // 6. 請求隊列沒有當前url地址 發送請求并把url地址存入請求隊列里 list.add(url); return Promise.resolve(axios);}/** * 請求響應回來執行這個函數 */export function completeRequest(response = {}) { const { config } = response; // 1.response里面config能拿到配置參數 const url = getUrl(config); // 2.獲取url地址 list.has(url) && list.delete(url); // 3.刪除請求隊列中的當前請求url地址}/** * 清空所有請求隊列 */export function clearRequestList(error) { // error 可以獲取到配置, 做一些操作。 list = new Set(); // 這里我就直接清空了}

以上就是我實現防止網絡請求的方式,之前我有使用過axios中CancelToken來進行取消請求;當會有一些問題。

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

到此這篇關于JavaScript如何實現防止重復的網絡請求的示例的文章就介紹到這了,更多相關JavaScript 防止重復的網絡請求內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 撕碎机_轮胎破碎机_粉碎机_回收生产线厂家_东莞华达机械有限公司 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 陕西自考报名_陕西自学考试网| BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 釜溪印象网络 - Powered by Discuz! | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 浙江上沪阀门有限公司 | 深圳APP开发_手机软件APP定制外包_小程序开发公司-来科信 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 期货软件-专业期货分析软件下载-云智赢| 中式装修设计_全屋定制家具_实木仿古门窗花格厂家-喜迎门 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 上海物流公司,上海货运公司,上海物流专线-优骐物流公司 | 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | 锂离子电池厂家-山东中信迪生电源| SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 次氯酸钠厂家,涉水级次氯酸钠,三氯化铁生产厂家-淄博吉灿化工 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 噪声治理公司-噪音治理专业隔音降噪公司| 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 考试试题_试卷及答案_诗词单词成语 - 优易学 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 超声波反应釜【百科】-以马内利仪器 |