【接口重復請求】axios通過AbortController解決頁面切換過快,接口重復請求問題

處理網絡請求時,我們經常會遇到需要中途取消請求的情況,比如用戶在兩個tab之間反復橫跳的場景,如果每個接口都從頭請求到結束,那必然會造成很大的服務壓力。

AbortController是一個Web API,它提供了一個信號對象(AbortSignal),該對象可以用來取消與Fetch API相關的操作。當我們創建AbortController實例時,會自動生成一個與之關聯的AbortSignal對象。我們可以將這個AbortSignal對象作為參數傳遞給fetch函數,從而實現對網絡請求的取消控制。

import axios from 'axios'
import QS from 'qs'//引入qs模塊,用來序列化post類型的數據// 創建map存儲未返回response的接口請求
const pendingRequests = new Map();const generateRequestKey = (config) => {// 處理請求數據,確保請求和響應時一致,response返回的config中可能存在序列化的data,需要轉換成json格式,否則生成的key不一致const normalizeData = (data) => {if (typeof data === 'string') {try {return JSON.parse(data);} catch {return data;}}return data;};return [config.method,config.url,JSON.stringify(normalizeData(config.params) || {}),JSON.stringify(normalizeData(config.data) || {})].join('|');};axios.defaults.baseURL = '/';
axios.defaults.timeout = 10000;
axios.defaults.headers.post['Content-Type'] = 'application/json';
// 如果需要跨域,可以設置withCredentials為true
axios.defaults.withCredentials = true; // 允許跨域請求時發送cookies// 創建axios實例
const service = axios.create({baseURL: '/api', // api的base_urltimeout: 10000,// 請求超時時間headers: {'Access-Control-Allow-Origin': '*','strict-origin-when-cross-origin': '*','Cache-Control': 'no-cache','Content-Type': 'application/x-www-form-urlencoded','userRole': 'WEB','Accept-Language': i18n.locale || localStorage.getItem('Accept-Language')}
});// 請求攔截器
service.interceptors.request.use(config => {config.headers['nh-token'] = localStorage.getItem('NH_TOKEN') || ""const token = localStorage.getItem('newToken') || ""if (token) config.headers['Authorization'] = 'Bearer ' + token // 新服務添加token// 生成請求key,用于取消重復的相同請求const requestKey = generateRequestKey(config, 'service.interceptors.request');// 如果存在相同請求,取消前一個if (pendingRequests.has(requestKey)) {const abortController = pendingRequests.get(requestKey);abortController.abort();}// 為當前請求創建新的控制器const controller = new AbortController();config.signal = controller.signal;pendingRequests.set(requestKey, controller);return config;
},error => {return Promise.error(error);})
// 響應攔截器
service.interceptors.response.use(response => {const requestKey = generateRequestKey(response.config, 'service.interceptors.response');pendingRequests.delete(requestKey);// console.log('Response=>', response.request.responseURL, response  );if (response.status === 200) {//result  0-正常  1-異常  10000-未登錄 4000-系統異常if (response.data.result == 10000) {// 登錄失敗,跳轉到首頁,重新登錄router.push({ path: '/login' })return Promise.resolve(response.data)} else {return Promise.resolve(response.data)}} else {return Promise.reject(response);}},error => {if (error.name === 'AbortError') {console.log('請求已被取消:', error.message);}// 取消請求時,不執行這里的代碼const requestKey = generateRequestKey(error.config || {});pendingRequests.delete(requestKey);if (error.status) {return Promise.reject(error.response);}})
export default service

在接口封裝層按照如上進行,可以滿足接口重復請求時,取消重復的操作。需要注意一點,config.data,從request層獲取的是Object,但是從response層獲取的是一個JSON化的String。所以通過normalizeData方法,進行數據解析,防止map找不到。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899968.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言跳表(Skip List)算法:數據世界的“時光穿梭機”

在數據結構算法中,有一種算法猶如“時空穿梭機”,能在瞬間跨越層層障礙,直擊目標——它就是跳表算法。下面,就讓我們一起揭開跳表算法的神秘面紗,通過實例探究其高效與魅力。 目錄 一、跳表算法是什么? …

2023第十四屆藍橋杯大賽軟件賽省賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

記錄刷題的過程、感悟、題解。 希望能幫到,那些與我一同前行的,來自遠方的朋友😉 大綱: 1、日期統計-(解析)-暴力dfs(😉藍橋專屬 2、01串的熵-(解析)-不要chu…

批量將文本文件轉換為 Word/PDF/Excel/圖片等其它格式

工作中我們經常會接觸到各種格式的文本文檔,比如說 txt 記事本文件、json文件、HTML格式文件等等。通常也會需要將文本文件轉換為其他的格式,比如說將文本文件轉換為 word 格式、PDF格式或者圖片格式等等。當我們想要對文本文件格式進行批量轉換的時候&a…

Java常用工具算法-2--加密算法1--對稱加密算法(推薦AES算法)

1、定義與核心原理 定義:加密和解密使用相同密鑰的算法。工作流程: 秘鑰協商:雙方需提前通過安全信道共享密鑰。加密過程:發送方用密鑰對明文加密,生成密文。解密過程:接收方用相同密鑰對密文解密&#xf…

WPS宏開發手冊——Excel常用Api

目錄 系列文章4、Excel常用Api4.1、判斷是否是目標工作excel4.2、獲取源工作表和目標工作表的引用4.3、獲取單元格的值4.4、設置單元格的值4.5、合并單元格4.6、獲取源范圍4.7、獲取源范圍行數4.8、通過源來獲取單元格的值4.9、設置單元格的背景顏色4.10、設置單元格的文字顏色…

安徽京準:GPS北斗衛星校時服務器助力大數據云計算

安徽京準:GPS北斗衛星校時服務器助力大數據云計算 安徽京準:GPS北斗衛星校時服務器助力大數據云計算 GPS北斗衛星校時服務器在大數據與云計算系統中發揮著關鍵作用,其通過提供高精度、高可靠的時間同步服務,解決了分布式系統的核…

音視頻 ColorSpace色彩空間詳解

前言 基于前篇介紹YUV格式,本文繼續介紹另一個重要概念顏色空間,又叫色彩空間;主要用于在音視頻開發中的色彩空間轉換。 色彩空間Color Space 色彩空間由色彩模型和色域共同定義。當色彩模型與特定的描述相關聯以后,就稱為色彩空間。 色彩模型Color Model 色彩模型Col…

高效定位 Go 應用問題:Go 可觀測性功能深度解析

作者:古琦 背景 自 2024 年 6 月 26 日,阿里云 ARMS 團隊正式推出面向 Go 應用的可觀測性監控功能以來,我們與程序語言及編譯器團隊攜手并進,持續深耕技術優化與功能拓展。這一創新性的解決方案旨在為開發者提供更為全面、深入且…

構造超小程序

文章目錄 構造超小程序1 編譯器-大小優化2 編譯器-移除 C 異常3 鏈接器-移除所有依賴庫4 移除所有函數依賴_RTC_InitBase() _RTC_Shutdown()__security_cookie __security_check_cookie()__chkstk() 5 鏈接器-移除清單文件6 鏈接器-移除調試信息7 鏈接器-關閉隨機基址8 移除異常…

大語言模型開發框架——LangChain

什么是LangChain LangChain是一個開發由語言模型驅動的應用程序的框架,它提供了一套工具、組件和接口,可以簡化構建高級語言模型應用程序的過程。利用LangChain可以使應用程序具備兩個能力: 上下文感知 將語言模型與上下文(提示…

自動化釋放linux服務器內存腳本

腳本說明 使用Linux的Cron定時任務結合Shell腳本來實現自動化的內存釋放。 腳本用到sync系統命令 sync的作用:sync 是一個 Linux 系統命令,用于將文件系統緩存中的數據強制寫入磁盤。 在你執行reboot、poweroff、shutdown命令時,系統會默認執…

Python Websockets庫深度解析:構建高效的實時Web應用

引言 在現代Web開發中,實時通信已經成為許多應用的核心需求。無論是聊天應用、在線游戲、金融交易平臺還是協作工具,都需要服務器和客戶端之間建立持久、雙向的通信通道。傳統的HTTP協議由于其請求-響應模式,無法有效滿足這些實時交互需求。…

【實用技巧】電腦重裝后的Office下載和設置

寫在前面:本博客僅作記錄學習之用,部分圖片來自網絡,如需引用請注明出處,同時如有侵犯您的權益,請聯系刪除! 文章目錄 前言下載設置總結互動致謝參考目錄導航 前言 在數字化辦公時代,Windows和…

Node.js 技術原理分析系列 —— Node.js 調試能力分析

Node.js 技術原理分析系列 —— Node.js 調試能力分析 Node.js 作為一個強大的 JavaScript 運行時環境,提供了豐富的調試能力,幫助開發者診斷和解決應用程序中的問題。本文將深入分析 Node.js 的調試原理和各種調試技術。 1. Node.js 調試原理 1.1 V8 調試器集成 Node.js…

【圖論】最短路徑問題總結

一圖勝千言 單源最短路徑 正權值 樸素Dijkstra dijkstra算法思想是維護一個永久集合U,全部點集合V。 循環n -1次 從源點開始,在未被訪問的節點中,選擇距離源點最近的節點 t。 以節點 t 為中間節點,更新從起點到其他節點的最短…

【最佳實踐】win11使用hyper-v安裝ubuntu 22/centos,并配置固定ip,掃坑記錄

文章目錄 場景查看本機的win11版本啟用hyper-vhyper-v安裝ubuntu22虛擬機1.準備好個人的 iso文件。2. hyper-v 快速創建3.編輯設置分配內存自定義磁盤位置設置磁盤大小連接網絡修改虛擬機名稱自定義檢查點位置 和智能分頁件位置虛擬機第一次連接給ubuntu22配置固定ip遇到過的坑…

自然語言處理(25:(終章Attention 1.)Attention的結構?)

系列文章目錄 終章 1:Attention的結構 終章 2:帶Attention的seq2seq的實現 終章 3:Attention的評價 終章 4:關于Attention的其他話題 終章 5:Attention的應用 目錄 系列文章目錄 前言 Attention的結構 一.seq…

Git 命令大全:通俗易懂的指南

Git 命令大全:通俗易懂的指南 Git 是一個功能強大且廣泛使用的版本控制系統。對于初學者來說,它可能看起來有些復雜,但了解一些常用的 Git 命令可以幫助你更好地管理代碼和協作開發。本文將介紹一些常用的 Git 命令,并解釋它們的…

基于yolov11的棉花品種分類檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv11的棉花品種分類檢測系統是一種高效、準確的農作物品種識別工具。該系統利用YOLOv11深度學習模型,能夠實現對棉花主要品種,包括樹棉(G. arboreum)、海島棉(G. barbadense)、草棉&a…

論文:Generalized Category Discovery with Clustering Assignment Consistency

論文下載: https://arxiv.org/pdf/2310.19210 一、基本原理 該方法包括兩個階段:半監督表示學習和社區檢測。在半監督表示學習中,使用了監督對比損失來充分地推導標記信息。此外,由于對比學習方法與協同訓練假設一致,研究引入了…