国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

防止重復(fù)提交請(qǐng)求

這篇具有很好參考價(jià)值的文章主要介紹了防止重復(fù)提交請(qǐng)求。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

防止重復(fù)提交請(qǐng)求,Axios,javascript,重復(fù)提交請(qǐng)求,axios,typescript,前端
前景提要:
ts 簡(jiǎn)易封裝 axios,統(tǒng)一 API
實(shí)現(xiàn)在 config 中配置開(kāi)關(guān)攔截器
axios 實(shí)現(xiàn)請(qǐng)求 loading 效果

用一個(gè)數(shù)組保存當(dāng)前請(qǐng)求的 url,此時(shí)還未響應(yīng)。如果再次發(fā)起同樣請(qǐng)求,比對(duì) url 發(fā)現(xiàn)已經(jīng)存在數(shù)組中,則攔截請(qǐng)求,提示重復(fù)提交。當(dāng)該請(qǐng)求響應(yīng)結(jié)束后,就將 url 從數(shù)組中剔除。則可再次發(fā)起上一次 url 的請(qǐng)求。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-741945.html

封裝攔截器

import { AxiosError } from "axios";
import { ElMessage } from "element-plus";
import { MyAxiosResponse, MyInternalAxiosRequestConfig } from "./request";

let pendingUrl: string[] = []; // pending 狀態(tài)的請(qǐng)求 url
const excludeUrl: string[] = ["/upload", "/upload/chunk"]; // 排除不需要攔截的url。比如并發(fā)上傳文件的 url 都是一樣的,就需要排除

/**
 * 比較請(qǐng)求的 url
 * @param {import("..").AxiosRequestConfig} config
 * @returns
 */
export function compareUrl(config: MyInternalAxiosRequestConfig) {
    // 配置中明確標(biāo)出 debounce 為 false,則關(guān)閉請(qǐng)求防抖。不寫(xiě)或者為 true,則開(kāi)啟防抖
    if (config.debounce === false) return config;

    // 白名單 url 不防抖處理
    if (config.url && excludeUrl.includes(config.url)) return config;

    if (config.url && pendingUrl.includes(config.url)) {
        // alert("重復(fù)請(qǐng)求");
        ElMessage.warning("請(qǐng)求頻繁");
        throw new Error("請(qǐng)求頻繁");
    } else {
        config.url && pendingUrl.push(config.url);
    }
    return config;
}

/**
 * 請(qǐng)求成功,過(guò)濾請(qǐng)求完畢的 url
 * @param {import("axios").AxiosResponse} res
 * @returns
 */
export function filterFulfilledUrlOnFulfilled(res: MyAxiosResponse) {
    pendingUrl = pendingUrl.filter(item => item != res.config.url);
    return res;
}

/**
 * 請(qǐng)求錯(cuò)誤,過(guò)濾請(qǐng)求完畢的 url
 * @param {import("axios").AxiosError} err
 * @returns
 */
export function filterFulfilledUrlOnRejected(err: AxiosError) {
    pendingUrl = pendingUrl.filter(item => item != err?.config?.url);
    throw err;
}

補(bǔ)充 config 配置并注冊(cè)攔截器

const DEFAULT_EXTRA_FEATURE_CONFIG = { showLoading: true, showMessage: true, debounce: true, retry: true };

/** 擴(kuò)展 axios 的請(qǐng)求配置類(lèi)型 */
export interface MyAxiosRequestConfig<TReqBodyData = any> extends AxiosRequestConfig<TReqBodyData> {
    interceptors?: {
        reqInterceptorOnFulfilled?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig;
        reqInterceptorOnRejected?: (err: AxiosError) => any;
        resInterceptorOnFulfilled?: (res: AxiosResponse) => AxiosResponse;
        resInterceptorOnRejected?: (err: AxiosError) => Promise<AxiosError>;
    };
    showLoading?: boolean;
    showMessage?: boolean;
    debounce?: boolean;
    retry?: boolean;
}

/** 給攔截器使用 */
export interface MyInternalAxiosRequestConfig extends InternalAxiosRequestConfig {
    showLoading?: boolean;
    showMessage?: boolean;
    debounce?: boolean;
    retry?: boolean;
}
import HttpRequest from "./http/request";
import { compareUrl, filterFulfilledUrlOnFulfilled, filterFulfilledUrlOnRejected } from "./http/debounceReq";
import { closeLoadingOnFulfilled, closeLoadingOnRejected, showLoading } from "./http/loading";
import { responseMessageOnFulfilled } from "./http/message";
import { getTokenResponseInterceptor, setAccessTokenRequestInterceptor } from "./http/token";
import { retryRequest } from "./http/retryRequest";

const httpRequest = new HttpRequest({
    baseURL: import.meta.env.VITE_APP_API_BASE_URL,
    timeout: import.meta.env.VITE_APP_API_TIMEOUT
});

// loading
httpRequest.getInstance().interceptors.request.use(showLoading);
httpRequest.getInstance().interceptors.response.use(closeLoadingOnFulfilled, closeLoadingOnRejected);

// debounceRequest
httpRequest.getInstance().interceptors.request.use(compareUrl);
httpRequest.getInstance().interceptors.response.use(filterFulfilledUrlOnFulfilled, filterFulfilledUrlOnRejected);

export default httpRequest;
``

到了這里,關(guān)于防止重復(fù)提交請(qǐng)求的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • CRM項(xiàng)目為新增用戶設(shè)置對(duì)應(yīng)的前端校驗(yàn)規(guī)則并發(fā)送Axios請(qǐng)求到后端將表單數(shù)據(jù)提交用戶信息------CRM項(xiàng)目

    template ? ? el-button type=\\\"primary\\\" @click=\\\"addUser()\\\"新增用戶/el-button ? ? el-button type=\\\"danger\\\"批量刪除/el-button ? ? el-table ? ? ? ? :data=\\\"userList\\\" ? ? ? ? style=\\\"width: 100%\\\" ? ? ? ? @selection-change=\\\"handleSelectionChange\\\" ? ? ? ? ? ? !-- 復(fù)選框 ? ?-- ? ? ? ? el-table-column type=\\\"selection\\\" width=\\\"33%\\\"

    2024年02月19日
    瀏覽(24)
  • TypeScript封裝Axios

    因axios基礎(chǔ)使用十分簡(jiǎn)單,可參考axios官方文檔,這里不在介紹他基本用法,主要講解攔截器。 攔截器主要分為兩種, 請(qǐng)求攔截器 和 響應(yīng)攔截器 。 請(qǐng)求攔截器 :請(qǐng)求發(fā)送之前進(jìn)行攔截,應(yīng)用于我們?cè)谡?qǐng)求發(fā)送前需要對(duì)請(qǐng)求數(shù)據(jù)做一些處理。例如: 攜帶token 當(dāng)請(qǐng)求時(shí)間過(guò)長(zhǎng)

    2024年02月11日
    瀏覽(39)
  • 前端如何防止接口重復(fù)提交

    接口重復(fù)提交指的是在網(wǎng)絡(luò)通信中,同一個(gè)請(qǐng)求被客戶端多次發(fā)送到服務(wù)器端的情況。這種情況可能由于多種原因?qū)е拢缬脩粼诘却陂g多次點(diǎn)擊提交按鈕、網(wǎng)絡(luò)超時(shí)后客戶端重新發(fā)送請(qǐng)求、客戶端發(fā)送的請(qǐng)求在網(wǎng)絡(luò)傳輸過(guò)程中出現(xiàn)重復(fù)等。 接口重復(fù)提交可能會(huì)導(dǎo)致多種

    2024年04月22日
    瀏覽(28)
  • springBoot防止重復(fù)提交

    springBoot防止重復(fù)提交

    兩種方法, 一種是后端實(shí)現(xiàn),較復(fù)雜,要通過(guò)自定義注解和AOP以及Redis組合實(shí)現(xiàn) 另一種是前端實(shí)現(xiàn),簡(jiǎn)單,只需通過(guò)js,設(shè)置過(guò)期時(shí)間,一定時(shí)間內(nèi),多次點(diǎn)擊按鈕只生效一次 自定義注解+AOP+Redis 自定義異常類(lèi)和全局異常處理 自定義異常類(lèi):CustomException 全局異常處理:Cust

    2024年02月11日
    瀏覽(21)
  • 微信小程序防止重復(fù)提交

    微信小程序在真機(jī)測(cè)試時(shí),遇到這樣一種情況:當(dāng)網(wǎng)絡(luò)條件差或卡頓的情況下,進(jìn)行某項(xiàng)操作時(shí),使用者會(huì)認(rèn)為點(diǎn)擊無(wú)效而進(jìn)行多次點(diǎn)擊,致使多次跳轉(zhuǎn)頁(yè)面或多次上傳同一表單,導(dǎo)致函數(shù)或接口被多次調(diào)用,實(shí)際上使用者只想調(diào)用函數(shù)和接口一次。 添加節(jié)流閥,即按下按鈕

    2024年02月13日
    瀏覽(32)
  • java防止重復(fù)提交的方法

    java防止重復(fù)提交的方法

    ? 為了防止重復(fù)提交,可以采用以下幾種方法: 1.?令牌機(jī)制(Token) 在表單中添加一個(gè)隱藏字段,用于存放一個(gè)隨機(jī)生成的令牌(Token)。當(dāng)用戶提交表單時(shí),將令牌一起提交到服務(wù)器。服務(wù)器接收到請(qǐng)求后,首先檢查令牌是否存在,如果不存在則拒絕請(qǐng)求;如果存在,則將

    2024年02月01日
    瀏覽(23)
  • 【axios網(wǎng)絡(luò)請(qǐng)求庫(kù)】認(rèn)識(shí)Axios庫(kù);axios發(fā)送請(qǐng)求、創(chuàng)建實(shí)例、創(chuàng)建攔截器、封裝請(qǐng)求

    功能特點(diǎn): 在瀏覽器中發(fā)送 XMLHttpRequests 請(qǐng)求 在 node.js 中發(fā)送 http請(qǐng)求 支持 Promise API 攔截請(qǐng)求和響應(yīng) 轉(zhuǎn)換請(qǐng)求和響應(yīng)數(shù)據(jù) 支持多種請(qǐng)求方式: axios(config) axios.request(config) axios.get(url[, config]) axios.delete(url[, config]) axios.head(url[, config]) axios.post(url[, data[, config]]) axios.put(url[, data[, c

    2024年02月10日
    瀏覽(65)
  • axios模擬表單提交

    axios默認(rèn)是application/json方式提交,controller接收的時(shí)候必須以@RequestBody的方式接收,有時(shí)候不太方便。如果axios以application/x-www-form-urlencoded方式提交數(shù)據(jù),controller接收的時(shí)候只要保證名字應(yīng)對(duì)類(lèi)型正確即可。 前端代碼: 這是利用Element-Plus模態(tài)框提供的三個(gè)SLOT(footer,header和

    2024年02月11日
    瀏覽(13)
  • SpringBoot 整合redis + Aop防止重復(fù)提交 (簡(jiǎn)易)

    SpringBoot 整合redis + Aop防止重復(fù)提交 (簡(jiǎn)易)

    redis下載 解壓 安裝 看一下就會(huì)有 ?進(jìn)入redis-6.0.8下的src目錄 (? src?目錄下有編譯后的 redis 服務(wù)程序 redis-server,還有用于測(cè)試的客戶端程序 redis-cli:) 然后啟動(dòng) redis默認(rèn)端口號(hào) 6379,建議更改。redis.conf是配置文件在? 與src是同級(jí)目錄。 要遠(yuǎn)程? #去掉保護(hù)模式,注釋掉bi

    2024年02月12日
    瀏覽(33)
  • 【axios】vue中axios的請(qǐng)求配置

    【axios】vue中axios的請(qǐng)求配置

    注意:本文實(shí)例化為T(mén)S版 axios 是一個(gè)基于 promise 封裝的網(wǎng)絡(luò)請(qǐng)求庫(kù),它是基于 原生XHR 進(jìn)行二次封裝,可以說(shuō)是 XHR 的一個(gè)子集,而 XHR 又是 Ajax 的一個(gè)子集 從瀏覽器中創(chuàng)建 XMLHttpRequests 從 node.js 創(chuàng)建 http 請(qǐng)求 支持 Promise API 攔截請(qǐng)求和響應(yīng) 轉(zhuǎn)換請(qǐng)求數(shù)據(jù)和響應(yīng)數(shù)據(jù) 取消請(qǐng)求

    2024年02月10日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包