react+antd4實(shí)現(xiàn)優(yōu)化大批量接口請求
背景
接到一個(gè)需求,需要做一個(gè)運(yùn)維的功能,對公司下平臺子系統(tǒng)做一個(gè)開關(guān)界面,要求可以大批量對系統(tǒng)進(jìn)行修改。這樣大批量的修改,如果有個(gè)老哥手一抖點(diǎn)了全選,那可能同時(shí)會發(fā)送幾十上百個(gè)接口,對瀏覽器和服務(wù)器都會是一個(gè)比較大的負(fù)擔(dān)。
相似的應(yīng)用場景還有:文件批量上傳等
使用技術(shù)棧:react hooks + antd4
分析
維護(hù)一個(gè)任務(wù)池,先默認(rèn)發(fā)出最大并發(fā)數(shù)量的接口請求,一個(gè)蘿卜一個(gè)坑,當(dāng)上一個(gè)請求結(jié)束(無論成功失?。?,則讓下一個(gè)請求進(jìn)入任務(wù)隊(duì)列,之道所有請求列表都請求完成,返回這個(gè)任務(wù)池的最終結(jié)果。
部分代碼實(shí)現(xiàn)
主要業(yè)務(wù)邏輯
// ... 點(diǎn)擊確定,先進(jìn)行前置校驗(yàn) const onSubmitHandle = (event) => { event.preventDefault(); // 防止觸發(fā)原生submit,導(dǎo)致瀏覽器頁面刷新 validateFields((err, values) => { // 校驗(yàn)通過 if(!err){ // 通過遍歷組裝參數(shù) const arrParam = concateDynamicParams(values); concurrentControl(arrParm, 5) .then(res)=> { // 獲取成功列表和失敗列表 const { sucSystem, faildSystem } = getSucAndFailedResult(res); const content = ( <p> {'修改成功的系統(tǒng):'} <br /> {`${sucSystem}`} <br /> {'修改失敗的系統(tǒng):'} <br /> {`${faildSystem}`} </p> ); Modal.info({ title: "提示", content, oKText: "確定", }) // 取消loading,重置列表等操作... } } }) }
維護(hù)任務(wù)池,控制并發(fā)數(shù)
const concurrentControl = (arrParam, maxNum = 10) => new Promise((resolve) => { // 無任務(wù)數(shù)據(jù)時(shí) if(!arrParam.length){ resolve([]); return; } const results = []; // 最終的結(jié)果集合,用于保存接口返回的信息 let index = 0; // 用于記錄下一個(gè)接口下標(biāo) let count = 0; // 用于記錄發(fā)送了多少條數(shù)據(jù) const request = async () => { if(index === arrParam.length) return; // 出口 const i = index; // 當(dāng)前下標(biāo)(備份) // 組裝請求路徑與參數(shù) const url = arrParam[i].url; const param = arrParam[i].data; index++; // 預(yù)先記錄下一個(gè)請求的下標(biāo) try{ // 發(fā)送請求 const resp = await dispatchSqlGuardSwitchProcess(url, param); result[i] = resp; // 記錄返回結(jié)果 } catch( error ){ result[i] = error; } finally { count++ ; // 當(dāng)前接口完成,下一個(gè)接口調(diào)用開始 if(count === arrParam.length){ // 全部任務(wù)池中的接口都調(diào)用完畢 resolve(results) } request()(); // 繼續(xù)下一個(gè)請求 } } // 初始化請求數(shù) const maxParallelRequests = Math.min(maxNum, arrParam.length); for(let i = 0; i < maxParallelRequests; i++){ request() } })
總結(jié)
核心思想是一個(gè)蘿卜一個(gè)坑,直到所有的蘿卜都從坑里出來。(誤)
通過維護(hù)一個(gè)任務(wù)池,標(biāo)記當(dāng)前請求,下一個(gè)請求,以及當(dāng)前總共請求的次數(shù),便可以做到前端控制并發(fā)的需求場景。
參考資料:關(guān)于前端:如何實(shí)現(xiàn)并發(fā)請求數(shù)量控制?
到此這篇關(guān)于react+antd4實(shí)現(xiàn)優(yōu)化大批量接口請求的文章就介紹到這了,更多相關(guān)react優(yōu)化請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解React如何優(yōu)雅地根據(jù)prop更新state值
這篇文章主要為大家詳細(xì)介紹了React如何優(yōu)雅地實(shí)現(xiàn)根據(jù)prop更新state值,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解下2023-11-11詳解在create-react-app使用less與antd按需加載
這篇文章主要介紹了詳解在create-react-app使用less與antd按需加載,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12一文詳解React中如何實(shí)現(xiàn)組件懶加載
懶加載是一種優(yōu)化技術(shù),旨在延遲加載不必要的資源,直到它們真正需要時(shí)再進(jìn)行加載,那么React的懶加載是如何實(shí)現(xiàn)的呢,下面小編就來和大家詳細(xì)講講吧2025-03-03React系列useSyncExternalStore學(xué)習(xí)詳解
這篇文章主要為大家介紹了React系列useSyncExternalStore的學(xué)習(xí)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07React實(shí)現(xiàn)響應(yīng)式布局的最佳實(shí)踐
在當(dāng)今的前端開發(fā)中,響應(yīng)式設(shè)計(jì)已經(jīng)成為必不可少的部分,隨著各種設(shè)備的出現(xiàn),確保我們的網(wǎng)頁在不同屏幕尺寸上展示良好,已經(jīng)成為開發(fā)者的首要任務(wù)之一,本文將介紹如何在React中實(shí)現(xiàn)響應(yīng)式布局,提供一些最佳實(shí)踐和示例代碼,幫助大家更好地理解這一概念2025-02-02react-beautiful-dnd拖拽排序功能的實(shí)現(xiàn)過程
這篇文章主要介紹了react-beautiful-dnd拖拽排序功能的實(shí)現(xiàn)過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07react+zarm實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼
本文主要介紹了react?+?zarm?實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05詳解React?ISR如何實(shí)現(xiàn)Demo
這篇文章主要為大家介紹了React?ISR如何實(shí)現(xiàn)Demo詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07