精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊 Ahooks 是怎么解決用戶多次提交問題?

開發 前端
通過 axios 攔截器以及其 CancelToken 功能,我們能夠在攔截器中自動將已發的請求取消,當然假如有一些接口就是需要重復發送請求,可以考慮加一下白名單功能,讓請求不進行取消。

本文來探索一下 ahooks 的 useLockFn。

場景

試想一下,有這么一個場景,有一個表單,你可能多次提交,就很可能導致結果不正確。

解決這類問題的方法有很多,比如添加 loading,在第一次點擊之后就無法再次點擊。另外一種方法就是給請求異步函數添加上一個靜態鎖,防止并發產生。這就是 ahooks 的 useLockFn 做的事情。

useLockFn

useLockFn 用于給一個異步函數增加競態鎖,防止并發執行。

它的源碼比較簡單,如下所示:

import { useRef, useCallback } from 'react';
// 用于給一個異步函數增加競態鎖,防止并發執行。
function useLockFn<P extends any[] = any[], V extends any = any>(fn: (...args: P) => Promise<V>) {
// 是否現在處于一個鎖中
const lockRef = useRef(false);
// 返回的是增加了競態鎖的函數
return useCallback(
async (...args: P) => {
// 判斷請求是否正在進行
if (lockRef.current) return;
// 請求中
lockRef.current = true;
try {
// 執行原有請求
const ret = await fn(...args);
// 請求完成,狀態鎖設置為 false
lockRef.current = false;
return ret;
} catch (e) {
// 請求失敗,狀態鎖設置為 false
lockRef.current = false;
throw e;
}
},
[fn],
);
}
export default useLockFn;

可以看到,它的入參是異步函數,返回的是一個增加了競態鎖的函數。通過 lockRef 做一個標識位,初始化的時候它的值為 false。當正在請求,則設置為 true,從而下次再調用這個函數的時候,就直接 return,不執行原函數,從而達到加鎖的目的。

缺點

雖然實用,但缺點很明顯,我需要給每一個需要添加競態鎖的請求異步函數都手動加一遍。那有沒有比較通用和方便的方法呢?

答案是可以通過 axios 自動取消重復請求。

axios 自動取消重復請求

axios 取消請求

對于原生的 XMLHttpRequest 對象發起的 HTTP 請求,可以調用 XMLHttpRequest 對象的 abort 方法。

那么我們項目中常用的 axios 呢?它其實底層也是用的 XMLHttpRequest 對象,它對外暴露取消請求的 API 是 CancelToken。可以使用如下:

const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.post('/user/12345', {
name: 'gopal'
}, {
cancelToken: source.token
})
source.cancel('Operation canceled by the user.'); // 取消請求,參數是可選的

另外一種使用的方法是調用 CancelToken 的構造函數來創建 CancelToken,具體使用如下:

const CancelToken = axios.CancelToken;
let cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
cancel = c;
})
});
cancel(); // 取消請求

如何自動取消重復的請求

知道了如何取消請求,那怎么做到自動取消呢?答案是通過 axios 的攔截器。

  • 請求攔截器:該類攔截器的作用是在請求發送前統一執行某些操作,比如在請求頭中添加 token 相關的字段。
  • 響應攔截器:該類攔截器的作用是在接收到服務器響應后統一執行某些操作,比如發現響應狀態碼為 401 時,自動跳轉到登錄頁。

具體的做法如下:

第一步,定義幾個重要的輔助函數。

  • generateReqKey:用于根據當前請求的信息,生成請求 Key。只有 key 相同才會判定為是重復請求。這一點很重要,而且可能跟具體的業務場景有關,比如有一種請求,輸入框模糊搜索,用戶高頻輸入關鍵字,一次性發出多個請求,可能先發出的請求,最后才響應,導致實際搜索結果與預期不符。這種其實就只需要根據 URL 和請求方法判定其為重復請求,然后取消之前的請求就可以了。

這里我認為,如果有需要的話,可以暴露一個 API 給開發者進行自定義重復的規則。這里我們先根據請求方法、url、以及參數生成唯一的 key 去做。

function generateReqKey(config) {
const { method, url, params, data } = config;
return [method, url, Qs.stringify(params), Qs.stringify(data)].join("&");
}
  • addPendingRequest。用于把當前請求信息添加到 pendingRequest 對象中。
const pendingRequest = new Map();
function addPendingRequest(config) {
const requestKey = generateReqKey(config);
config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
if (!pendingRequest.has(requestKey)) {
pendingRequest.set(requestKey, cancel);
}
});
}
  • removePendingRequest。檢查是否存在重復請求,若存在則取消已發的請求。
function removePendingRequest(config) {
const requestKey = generateReqKey(config);
if (pendingRequest.has(requestKey)) {
const cancelToken = pendingRequest.get(requestKey);
cancelToken(requestKey);
pendingRequest.delete(requestKey);
}
}

第二步,添加請求攔截器。

axios.interceptors.request.use(
function (config) {
removePendingRequest(config); // 檢查是否存在重復請求,若存在則取消已發的請求
addPendingRequest(config); // 把當前請求信息添加到pendingRequest對象中
return config;
},
(error) => {
return Promise.reject(error);
}
);

第二步,添加響應攔截器。

axios.interceptors.response.use(
(response) => {
removePendingRequest(response.config); // 從pendingRequest對象中移除請求
return response;
},
(error) => {
removePendingRequest(error.config || {}); // 從pendingRequest對象中移除請求
if (axios.isCancel(error)) {
console.log("已取消的重復請求:" + error.message);
} else {
// 添加異常處理
}
return Promise.reject(error);
}
);

到這一步,我們就通過 axios 完成了自動取消重復請求的功能。

思考與總結

雖然可以通過類似 useLockFn 這樣的 hook或方法給請求函數添加競態鎖的方式解決重復請求的問題。但這種還是需要依賴于開發者的習慣,如果沒有一些規則的約束,很難避免問題。

通過 axios 攔截器以及其 CancelToken 功能,我們能夠在攔截器中自動將已發的請求取消,當然假如有一些接口就是需要重復發送請求,可以考慮加一下白名單功能,讓請求不進行取消。

參考

  • Axios 如何取消重復請求?

參考資料

[1]詳情: https://github.com/GpingFeng/hooks。

責任編輯:姜華 來源: 前端雜貨鋪
相關推薦

2022-06-08 08:01:20

useEffect數組函數

2022-07-01 07:31:18

AhooksDOM場景

2024-05-31 09:31:00

2021-07-02 07:06:20

調試代碼crash

2021-09-26 06:43:07

MySQL深分頁優化

2021-11-09 10:20:15

MySQL深分頁數據庫

2021-09-27 13:33:03

MySQL深分頁數據庫

2022-09-28 11:34:27

用戶行為數據業務

2023-02-26 08:42:10

源碼demouseEffect

2022-11-17 07:43:13

2019-11-26 16:32:41

區塊鏈信任問題

2010-09-30 15:10:12

Javascriptimg

2010-10-08 15:35:32

Javascriptimg

2024-03-27 07:55:58

SpringRedis海量

2021-08-10 07:00:01

Redis單線程并發

2022-07-27 08:52:10

MySQL二階段提交

2022-06-10 08:01:01

ahookshook代碼

2021-07-26 05:10:13

JavaJakarta EEJSR

2020-06-17 07:40:26

監控系統zabbix

2021-07-20 08:03:43

微服務應用程序
點贊
收藏

51CTO技術棧公眾號

亚洲高清123| 欧美大片免费看| 91蝌蚪视频在线观看| 午夜精品一区| 久久综合九色| 日韩av在线直播| 欧美 日韩 国产 激情| 成人在线视频亚洲| 成人一级片网址| 日本久久久久久久久久久| 国产三级黄色片| 1769国产精品视频| 色欧美乱欧美15图片| 亚洲成人一区二区三区| 亚洲精品一区二区三区不卡| 亚洲作爱视频| 欧美xxxx做受欧美.88| www.超碰97| 成人在线精品| 大伊人狠狠躁夜夜躁av一区| 天堂v在线视频| 香蕉视频911| 久久久久.com| 九九热视频这里只有精品| 亚洲最大免费视频| 午夜日韩影院| 欧美性xxxxxx少妇| 欧美女人性生活视频| 亚洲 欧洲 日韩| 日韩国产成人在线| 欧美成人亚洲| 精品视频偷偷看在线观看| 国产91在线免费观看| 欧美一级大片| 黑人与娇小精品av专区| 超碰10000| 欧美jizzhd欧美| 91在线你懂得| 国产a一区二区| 伊人网站在线观看| 一区二区日本视频| 久久久久久久久网站| 久久精品一区二区三区四区五区 | 欧美日本国产在线| 精品成人av一区二区三区| 亚洲国产aⅴ精品一区二区| 欧美日韩免费一区二区三区视频 | 日韩国产欧美在线视频| 欧美极品少妇xxxxx| √天堂中文官网8在线| 精品视频国产| 亚洲欧美国产精品| 奇米777第四色| 国产a亚洲精品| 一本久道久久综合中文字幕| www精品久久| 怡红院红怡院欧美aⅴ怡春院| 欧美国产97人人爽人人喊| 欧美日韩精品久久久免费观看| 精品二区在线观看| 青青草成人在线观看| 国产精品久久久久久亚洲影视| 国产情侣自拍av| 亚洲一区二区三区免费在线观看| 久精品免费视频| 国产亚洲小视频| 国产综合精品一区| 欧美成人激情在线| 黄色小视频在线免费看| 欧美体内she精视频在线观看| 欧美激情精品久久久久久变态| 高h视频免费观看| 欧美精品激情| 高清欧美性猛交| 国产小视频在线观看免费| 99成人精品| 91国内产香蕉| 嫩草影院一区二区三区| 青青草国产精品亚洲专区无| 成人午夜两性视频| 精品人妻一区二区三区含羞草 | 日本韩国欧美三级| 三年中国国语在线播放免费| 日本在线一区二区| 欧美一区二区私人影院日本| 亚洲免费av一区| 亚洲**毛片| 亚洲国产精品一区二区久| 亚洲图片另类小说| 色88久久久久高潮综合影院| 理论片在线不卡免费观看| 久草视频在线免费看| 国产精品五区| 国产精品视频资源| 国产熟女一区二区丰满| 99久久99久久精品国产片果冻| 久久青青草综合| 色三级在线观看| 一区二区三区精密机械公司| 99精品视频在线看| 国产精品久久久久久妇女| 欧美日韩国产综合视频在线观看| 无码任你躁久久久久久老妇| 在线亚洲a色| 欧美情侣性视频| av资源免费观看| 国产在线日韩欧美| 国产日本一区二区三区| 午夜毛片在线| 欧美日韩国产精品一区二区三区四区 | 亚洲素人一区二区| 97超碰青青草| 成人国产精品久久| 亚洲欧美一区二区三区四区 | 亚洲自拍欧美精品| 久久视频这里有精品| 日韩一区二区三区四区五区| 日韩欧美国产三级| 免费在线观看a视频| 激情91久久| 91精品国产综合久久香蕉最新版 | 亚洲系列中文字幕| 美女毛片在线观看| 日本女优在线视频一区二区| 精品蜜桃一区二区三区| 免费a级毛片在线播放| 色哟哟一区二区| 国产精品无码自拍| 91精品天堂福利在线观看| 欧美一级大片在线免费观看| 亚洲欧美黄色片| 国产精品美女久久久久久久| 大肉大捧一进一出好爽视频| 中文在线综合| 久久精品国产综合| 亚洲天堂中文字幕在线| www精品美女久久久tv| 国产一线二线三线女| 日韩视频网站在线观看| 亚洲美女性生活视频| 成人免费看片98| 国产综合色精品一区二区三区| 亚洲精品国产精品国自产| 蜜桃视频www网站在线观看| 精品国产成人在线影院 | 亚洲一级二级在线| 国产精品久久久久久久99| 婷婷伊人综合| 国产噜噜噜噜久久久久久久久| av在线之家电影网站| 欧美日韩在线第一页| 亚洲自拍第三页| 99久久.com| 国产精品色婷婷视频| 大乳在线免费观看| 婷婷开心久久网| 日本少妇色视频| 亚洲黄色视屏| 欧美lavv| 久久uomeier| 中国china体内裑精亚洲片| 中文字幕在线播| 国产欧美日韩三区| 亚洲乱码国产一区三区| 成人同人动漫免费观看| 国产精品国产三级国产专播精品人 | 久久av.com| 国产丝袜在线视频| 亚洲精品你懂的| 国产视频1区2区3区| 色喇叭免费久久综合| 国产欧美精品va在线观看| 国产精品久久久久久福利| 在线成人午夜影院| 久久综合激情网| 91色|porny| www.久久久精品| 91超碰国产精品| 国产精品成人观看视频免费| 99riav视频在线观看| 亚洲人成在线播放| 日韩精选在线观看| 依依成人综合视频| 99久久人妻精品免费二区| 久久精品九九| 一区二区在线观| 99视频这里有精品| 91精品国产91久久久久久不卡| 青青草视频在线观看| 欧美色综合网站| 国产综合精品在线| 国产成人免费av在线| aa视频在线播放| 国产大片一区| 国产精品av一区| 成人免费一区| 九九视频直播综合网| 国产日本在线| 91精品久久久久久蜜臀| 二区视频在线观看| 久久亚洲捆绑美女| ass极品水嫩小美女ass| 国产欧美不卡| 成人性做爰片免费视频| 欧美激情影院| 91精品视频观看| 偷拍自拍在线看| 国产亚洲一级高清| 亚洲乱熟女一区二区| 欧美性极品xxxx做受| 99久久婷婷国产综合| 91视频.com| 中文字幕在线视频播放| 男女男精品视频| 精品www久久久久奶水| 一本精品一区二区三区| 欧美尤物一区| 成人爽a毛片免费啪啪红桃视频| 国产日韩欧美在线播放| av最新在线| 久久99国产精品自在自在app| 日韩在线无毛| 亚洲成在人线av| 一级黄色片在线观看| 日本精品一区二区三区高清| 久久综合亚洲色hezyo国产| 亚洲少妇30p| 高清国产在线观看| 久久精品这里都是精品| 精品国产乱码久久久久夜深人妻| 国内一区二区视频| 香蕉视频禁止18| 成人黄色在线播放| 亚洲欧美一区二区三区不卡| 国产精品一二| 国产精品视频一二三四区| 九一精品国产| 精品伦理一区二区三区| 91成人精品在线| 成人h视频在线观看播放| 77thz桃花论族在线观看| 精品中文字幕视频| 黄色网在线播放| yw.139尤物在线精品视频| 久草在现在线| 中文字幕av一区中文字幕天堂| 五月婷婷在线观看视频| 日韩高清免费在线| 欧日韩在线视频| 亚洲国产精品久久久久久| 国产欧美一区二区三区视频在线观看| 欧美图片一区二区三区| 久久久久在线视频| 欧美亚洲国产一区在线观看网站 | 4k岛国日韩精品**专区| 日本片在线观看| 久久久之久亚州精品露出| 97caopor国产在线视频| 欧美激情videoshd| 色呦呦网站在线观看| 久久久日本电影| 美足av综合网| 91av视频在线| 另类专区亚洲| 国产精品一区二区女厕厕| 91精品国产66| 91亚洲精品久久久| 美女日韩一区| 国产一区二区在线观看免费播放| 国语一区二区三区| 欧洲一区二区在线观看| 精品久久不卡| 青青草影院在线观看| 欧美黄色一区| av观看免费在线| 老牛国产精品一区的观看方式| 老熟妇仑乱视频一区二区| 肉色丝袜一区二区| 亚洲第一区第二区第三区| 国产精品系列在线播放| 亚洲久久久久久| 久久亚洲精华国产精华液| 99成人在线观看| 亚洲精品视频在线观看网站| 制服.丝袜.亚洲.中文.综合懂色| 粉嫩av一区二区三区免费野| 亚洲一区二区视频在线播放| 91麻豆精品国产91久久久更新时间| 成人免费观看在线视频| 精品偷拍一区二区三区在线看| 在线激情网站| 欧美成人午夜激情视频| 欧美人体一区二区三区| 国产欧美精品日韩| 国产精品毛片视频| 日韩尤物视频| 亚洲大胆在线| 无人在线观看的免费高清视频 | 日韩一区欧美| 久久综合久久久久| 免费观看30秒视频久久| 黄页网站在线看| 国产午夜亚洲精品羞羞网站| 一级黄色录像视频| 欧美日韩一区三区四区| 亚洲精品无码专区| 久久精品国产一区二区电影| 超碰在线视屏| 99久久久精品免费观看国产| 综合伊思人在钱三区| 精品久久久久久无码中文野结衣| 一区二区三区四区五区在线| 日韩精品在线播放视频| 久久精品一区二区三区av| 日韩成年人视频| 91麻豆精品国产91久久久更新时间 | 微拍福利一区二区| 亚洲精品成a人| 国产又大又粗又爽| 精品国产制服丝袜高跟| 在线观看精品一区二区三区| 69视频在线免费观看| 欧美成人毛片| 欧美日韩一区二区视频在线观看| 欧美精品导航| 极品白嫩少妇无套内谢| 中文av字幕一区| 欧美人一级淫片a免费播放| 精品精品国产高清a毛片牛牛 | 亚洲欧美激情在线观看| 中文字幕9999| 国产国产一区| 久久精品美女| 亚洲尤物在线| 色男人天堂av| 一区二区三区日本| 亚洲精品国产精品国自产网站按摩| 亚洲国产欧美一区二区三区久久| 手机在线免费av| 国产日韩欧美黄色| sdde在线播放一区二区| 中文字幕乱码人妻综合二区三区 | 人人艹在线视频| 在线观看国产91| 高清中文字幕一区二区三区| 欧美亚洲午夜视频在线观看| 国产亚洲一区二区三区不卡| 国产精品自拍片| 97精品国产露脸对白| 久久亚洲国产成人精品性色| 日韩欧美在线一区二区三区| 久久亚洲导航| caoporen国产精品| 欧美一区二区综合| 色视频在线免费观看| 国产成人激情视频| 成人精品毛片| 乱人伦xxxx国语对白| 国产麻豆精品久久一二三| 黄页网站免费观看| 日韩美女主播在线视频一区二区三区| 手机在线免费av| 91亚洲一区精品| 精品白丝av| 日本少妇xxxx| 欧美天天综合色影久久精品| av在线电影免费观看| 国产精品成人播放| 香蕉综合视频| av噜噜在线观看| 亚洲午夜成aⅴ人片| 无码精品视频一区二区三区| 国产精国产精品| 日韩精品一区国产| 久久久久久免费看| 国产日韩一级二级三级| 亚洲性生活大片| 欧美大胆在线视频| 91久久精品无嫩草影院| 国产精品亚洲αv天堂无码| 国产欧美久久久精品影院| 国产毛片在线视频| 久久久久久久爱| 日韩欧美网站| 潘金莲一级淫片aaaaaaa| 精品久久久久久久久中文字幕 | 日韩视频免费直播| 欧美日韩在线视频免费观看| 欧美一区二区在线| 日韩精品欧美精品| 国产一级片免费| 国产香蕉精品视频一区二区三区 | 精品视频免费在线| 欧美人与动牲性行为| 精品欧美一区二区久久久伦| 久久99热这里只有精品| 久艹在线观看视频| 精品性高朝久久久久久久| 亚洲一区有码| 缅甸午夜性猛交xxxx|