精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美啪啪网站| 国产视频精品久久| 亚洲国产导航| 亚洲欧美日韩天堂一区二区| 污污的网站免费| h片视频在线观看| 国产精品三级在线观看| 成人91免费视频| 高潮毛片又色又爽免费 | 亚洲www免费| 一区二区三区日韩欧美精品| 欧美美乳视频网站在线观看| 91在线你懂的| 亚洲综合三区| 欧美肥老妇视频| 天天躁夜夜躁狠狠是什么心态| 精品久久国产一区| 91久久久免费一区二区| 亚洲色欲久久久综合网东京热| 免费的av网站| 亚洲欧美一区二区三区情侣bbw| 日韩福利在线| 亚洲美女综合网| 美国一区二区三区在线播放 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲人成777| 欧美午夜久久久| 青青在线视频免费观看| av在线日韩国产精品| 不卡视频在线观看| 96pao国产成视频永久免费| 精品一区二区无码| 亚洲视频1区| 久久久日本电影| 天天天天天天天天操| 成人3d精品动漫精品一二三| 亚洲精品理论电影| 日本精品一二三区| 三级欧美日韩| 欧美一级淫片007| 国产成人在线综合| 久久免费资源| 欧美日韩一区成人| 亚洲一二三区av| 日韩国产激情| 日韩欧美国产高清91| 男人c女人视频| 中文字幕在线观看网站| 亚洲人成网站影音先锋播放| 中文字幕在线中文字幕日亚韩一区| 国产一二三区在线视频| 2020国产成人综合网| 蜜桃狠狠色伊人亚洲综合网站| 天堂av在线免费| 99久久婷婷国产| 精品蜜桃传媒| 日韩精品视频在线观看一区二区三区| 国产精品白丝jk白祙喷水网站| 91色视频在线观看| 性一交一乱一伧老太| 国产成人激情av| 国产区一区二区| 手机看片国产1024| 91麻豆视频网站| 欧美一区二区三区精美影视| 成人免费在线电影| 中文字幕制服丝袜成人av| 综合网五月天| 在线看一级片| 精品毛片三在线观看| 熟女少妇在线视频播放| 日本高清不卡一区二区三区视频| 欧美亚洲国产一区二区三区| 欧美又黄又嫩大片a级| 久久99成人| 亚洲黄色免费三级| 久久久视频6r| 天天久久综合| 国产综合在线视频| 午夜精品免费观看| 黑人精品欧美一区二区蜜桃| 亚洲影院高清在线| 污视频在线免费| 国产三级精品三级在线专区| 中文字幕一区二区三区四区五区| 免费在线看污片| 一本大道av一区二区在线播放| 国产九九在线观看| 都市激情亚洲| 在线播放日韩欧美| 中文字幕手机在线观看| 午夜宅男久久久| 91网站在线看| 涩爱av在线播放一区二区| 中文字幕不卡一区| www婷婷av久久久影片| 人人视频精品| 日韩女优毛片在线| 中文字幕第20页| 亚洲电影在线一区二区三区| 91爱视频在线| 国产情侣激情自拍| 91亚洲精品久久久蜜桃网站| 伊人色综合影院| 涩涩视频网站在线观看| 欧美一卡二卡在线观看| 五月婷婷综合在线观看| 欧美激情91| 国产精品88a∨| 少妇高潮久久久| 国产精品国产三级国产aⅴ无密码| 人妻av无码专区| 97久久中文字幕| 亚洲人成网站999久久久综合| 欧美国产在线看| 日韩国产成人精品| 国内视频一区| 午夜小视频福利在线观看| 一本一道久久a久久精品| 日本一级大毛片a一| 日韩三级在线| 日本一区二区三区在线播放| 亚洲男女视频在线观看| 亚洲视频精选在线| 色一情一区二区| 国产欧美日韩在线一区二区| 午夜精品久久久久久久男人的天堂| 国产理论视频在线观看| 国产网站一区二区| 欧美 日韩 亚洲 一区| 日韩成人在线观看视频| 久久久999国产| 亚洲视频久久久| 国产无一区二区| 国产l精品国产亚洲区久久| 超碰精品在线观看| 欧美高跟鞋交xxxxxhd| 91午夜交换视频| 国产欧美一区二区精品仙草咪| 97国产在线播放| 国产精品sss在线观看av| 欧美成人精品xxx| 国产av无码专区亚洲av| 一色屋精品亚洲香蕉网站| 三上悠亚在线一区二区| 欧美亚洲国产激情| 国产精品狠色婷| av在线免费一区| 欧美色窝79yyyycom| 国产一区二区三区四区五区六区| 国产毛片久久| 人偷久久久久久久偷女厕| 欧美专区福利免费| 在线观看精品自拍私拍| 一级片视频免费| 亚洲欧美精品午睡沙发| 伊人五月天婷婷| 欧美欧美天天天天操| 成人久久18免费网站漫画| 丝袜在线观看| 精品国产免费一区二区三区四区 | 色先锋aa成人| 日韩一区二区a片免费观看| 日韩精品一卡二卡三卡四卡无卡| 日本视频一区在线观看| 91精品国产66| 久久精品视频在线播放| 亚洲精品字幕在线| 欧美日韩久久久久| 亚洲精品国产熟女久久久| 蜜桃久久久久久| 国产 国语对白 露脸| 国产一级成人av| 69av成年福利视频| 成人综合影院| 制服丝袜激情欧洲亚洲| 久久综合色综合| 91在线看国产| 久久久久xxxx| 亚洲精选91| 婷婷四月色综合| 亚洲一区二区三区在线免费| 91极品女神在线| yourporn在线观看中文站| 日韩欧美成人一区| 黄色免费av网站| 亚洲三级电影网站| 欧美丰满少妇人妻精品| 激情图区综合网| 国产96在线 | 亚洲| 日韩电影免费网址| 成人三级视频在线观看一区二区| 欧美黑人疯狂性受xxxxx野外| 中文字幕在线国产精品| 亚洲精品成av人片天堂无码 | 一区二区三区自拍| 欧美老熟妇乱大交xxxxx| 国产一区二区免费视频| 久久精品.com| 欧美私人啪啪vps| 日本欧美色综合网站免费| 香港久久久电影| 国产精品第七十二页| 波多野结衣中文在线| 最近2019中文字幕在线高清| 成人1区2区3区| 欧美少妇bbb| 男女啊啊啊视频| 亚洲欧美视频在线观看视频| 久操视频免费看| 成人久久18免费网站麻豆| 视频在线观看免费高清| 午夜在线精品偷拍| 国产69精品久久久久999小说| 日韩理论在线| 欧美性天天影院| 日韩大胆成人| 国产经品一区二区| 99热这里有精品| 国产精品美女久久久久久免费| av电影在线地址| 欧美成人精品xxx| 男人在线资源站| 国产亚洲精品久久久久动| 无码精品在线观看| 精品国产制服丝袜高跟| 国产日产亚洲系列最新| 欧美三级三级三级| 国产免费一区二区三区四区五区| 午夜天堂影视香蕉久久| 九九久久免费视频| 亚洲免费观看视频| 26uuu成人网| 亚洲色图20p| www.97视频| 亚洲日本在线视频观看| 少妇高潮惨叫久久久久| 中文字幕+乱码+中文字幕一区| 成人免费无遮挡无码黄漫视频| 久久午夜羞羞影院免费观看| 污片免费在线观看| 成+人+亚洲+综合天堂| 性高潮免费视频| 丁香桃色午夜亚洲一区二区三区| 永久看看免费大片| 国产999精品久久久久久| 又黄又爽又色的视频| 国产精品乡下勾搭老头1| 少妇愉情理伦片bd| 国产高清久久久| 久草免费资源站| av电影在线观看一区| 亚洲av成人片色在线观看高潮| av电影在线观看不卡| 亚洲欧美日本一区| 久久综合久久鬼色| 我不卡一区二区| 国产精品国产三级国产三级人妇 | 色综合久久天天综合网| 黄色片视频免费| 欧美性色欧美a在线播放| 在线免费观看一级片| 欧美精品久久一区二区三区| a天堂在线观看视频| 精品久久久久久无| 香蕉久久一区二区三区| 亚洲欧美在线一区二区| www视频在线观看免费| 精品国产一区二区三区久久| 黄色在线免费网站| 欧美激情综合亚洲一二区| 草草视频在线| 国产精品久久久久久久9999| 国产精品久一| 国内视频一区| 日韩电影免费网址| 久久综合久久久久| 久久久久久自在自线| 精品久久久99| 成人av在线电影| 谁有免费的黄色网址| 亚洲麻豆国产自偷在线| 国产成人无码精品久久久久| 欧美亚洲国产怡红院影院| 精品国产999久久久免费| 精品亚洲国产视频| 精品美女在线观看视频在线观看| 久久久久久一区二区三区| 国产成人精品123区免费视频| 成人午夜激情网| 日韩欧美影院| 亚洲精品偷拍视频| 午夜综合激情| 中文字幕第10页| 国产色爱av资源综合区| 免费毛片在线播放免费| 欧洲精品中文字幕| 人妻一区二区三区免费| 日韩小视频在线观看| 九色porny丨入口在线| 91久久久久久国产精品| 免费久久久久久久久| 中文字幕成人一区| 老司机午夜精品视频在线观看| 国产精品熟女一区二区不卡| 国产拍欧美日韩视频二区| 久久精品欧美一区二区| 欧美日韩一卡二卡| 清纯唯美亚洲色图| 欧美人与物videos| 日本一区二区中文字幕| 美日韩精品免费| 黄色欧美日韩| 一级做a爱视频| 中文字幕成人av| 国产精品免费精品一区| 精品国产乱码久久久久久蜜臀 | 亚洲黄色性网站| 中文字幕视频一区二区| 精品性高朝久久久久久久| 午夜激情在线| 91在线视频免费| 日本一二区不卡| 黄色一级二级三级| 99re免费视频精品全部| 久热这里只有精品在线| 欧美一级黄色片| 福利视频在线| 成人午夜一级二级三级| 色88久久久久高潮综合影院| 欧美黑人又粗又大又爽免费| 99久久久无码国产精品| 久久久久无码国产精品| 日韩女优视频免费观看| www在线观看播放免费视频日本| 国产精品大片wwwwww| 国产精品免费大片| 一本色道无码道dvd在线观看| av在线这里只有精品| 国产五月天婷婷| 欧美mv和日韩mv国产网站| 欧美人与性动交α欧美精品济南到 | 日韩免费在线电影| 亚洲视频sss| 麻豆精品一区二区av白丝在线| 中文字幕第69页| 欧美喷潮久久久xxxxx| 在线免费观看黄| 成人乱人伦精品视频在线观看| 91精品国产自产在线观看永久∴ | 一区二区三区黄色片| 中文字幕日韩高清| 在线高清欧美| 8x8x华人在线| 成人高清视频在线| 天海翼一区二区| 亚洲乱码国产乱码精品精| 台湾佬成人网| 亚洲自拍三区| 国产乱码一区二区三区| 久久久精品91| 日韩精品一区二区三区第95| 欧美片第一页| 欧美 日韩 国产 在线观看| 国产精品一区二区x88av| 久久夜靖品2区| 亚洲三级av在线| 色噜噜成人av在线| 日韩 欧美 视频| 国产午夜亚洲精品理论片色戒| 在线播放精品视频| 久操成人在线视频| 日韩精品免费一区二区夜夜嗨| 亚洲精品一二三四五区| 亚洲精品日日夜夜| 青青草在线视频免费观看| 国产精品吊钟奶在线| 91精品天堂福利在线观看| 国产成人精品无码片区在线| 日本精品视频一区二区三区| 国产精品剧情| 欧美成人在线免费观看| 久久99精品网久久| 日韩精品视频免费看| 一区二区福利视频| 亚洲综合网狠久久| 欧美综合在线观看视频| 尤物av一区二区| 国产小视频在线观看| 99电影网电视剧在线观看| 久久一二三四| 九九热这里有精品视频| 一区二区欧美亚洲| av成人综合| 91精品无人成人www| 午夜精品在线视频一区| 思思99re6国产在线播放| 久久手机视频| 国产v综合v亚洲欧| 亚洲视屏在线观看|