前端请求防抖

对于表单提交等场景,用户手滑可能会出现连续点击多次提交按钮的情况,此时前端需要做下请求防抖。

实现思路:定义一个防抖列表,在请求拦截中进行判断,如果这个接口中有携带我们定义需要处理防抖的参数,则进行防抖逻辑。如果只是单纯的切换查询条件,没必要也不能做防抖处理,否则会影响用户体验。

防抖逻辑大致为:

  1. 根据请求时已有的参数,如接口地址、请求类型、接口参数等等,自行将其拼成字符串
  2. 然后判断这个字符串在不在这个防抖列表中
  3. 如果在那就请求拦截,如果不在,则将这个字符串添加至这个防抖列表中
  4. 同时设置一个定时器,500毫秒后删除这个字符串

这里以vue3+axios为例

import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'

const config = {
  baseURL: '/api',
  timeout: 5000
}

const store = useGlobalToken()

class RequestHttp {
  service: AxiosInstance
  debouncUrlList: string[]
  public constructor(config: AxiosRequestConfig) {    
    ...
    this.debouncUrlList = [] // 防抖的url列表
    // 请求拦截
    this.service.interceptors.request.use(
      async (config: AxiosRequestConfig | any) => {
        // 防抖处理
        if (config.restrict) this.debounce(config)
        ...
    )

    // 响应拦截
    this.service.interceptors.response.use()
  }

  // 防抖处理
  debounce(config: AxiosRequestConfig) {
    const data = config.method === 'get' ? config.params : config.data
    const str = (((config.method as string) + config.url) as string) + JSON.stringify(data)
    if (~this.debouncUrlList.indexOf(str)) {
      ElMessage.warning('请勿重复请求')
      throw new Error('重复请求')
    }
    this.debouncUrlList.push(str)
    setTimeout(() => {
      this.debouncUrlList = this.debouncUrlList.filter((e) => e !== str)
    }, 500)
  }

  // 清除防抖
  clearDebounce(config: AxiosRequestConfig) {
    const data = config.method === 'get' ? config.params : config.data
    const str = (((config.method as string) + config.url) as string) + JSON.stringify(data)
    this.debouncUrlList = this.debouncUrlList.filter((e) => e !== str)
  }
}
export default new RequestHttp(config)

clearDebounce方法为手动清除防抖,在特定的场景下自行调用即可

使用:

在定义api的文件中,在需要防抖的接口上添加restrict: true参数即可

// 新增
export const postMarketTrack = (params: any) => {
  return http.post('xxx', params, { restrict: true })
}

前端防抖是一种常用的技术,用于减少事件触发的频率,防止频繁触发回调函数。在Promise中实现前端防抖的方法如下: ```javascript function debouncePromise(fn, delay) { let timerId; return function (...args) { return new Promise((resolve, reject) => { clearTimeout(timerId); timerId = setTimeout(() => { try { const result = fn.apply(this, args); resolve(result); } catch (error) { reject(error); } }, delay); }); }; } ``` 这个 `debouncePromise` 函数接受两个参数:`fn` 是要防抖的函数,`delay` 是延迟时间。它返回一个新的函数,每次被调用时会设置一个定时器,在延迟时间内没有再次调用时,才会执行原始函数,并返回一个Promise对象。 你可以将要防抖的函数作为参数传递给 `debouncePromise` 函数,然后调用返回的函数来进行防抖处理。这样做可以确保在一段时间内只触发一次函数执行,减少不必要的计算和请求,提高性能和用户体验。 示例用法: ```javascript // 要防抖的原始函数 function fetchData() { // 异步操作,例如发送请求获取数据 // ... } // 使用防抖包装原始函数 const debouncedFetchData = debouncePromise(fetchData, 500); // 调用防抖函数 debouncedFetchData().then((result) => { // 处理结果 }).catch((error) => { // 处理错误 }); ``` 在上述示例中,`fetchData` 是需要防抖的原始函数,通过 `debouncePromise` 包装后返回的 `debouncedFetchData` 函数来进行防抖处理。每次调用 `debouncedFetchData` 函数时,都会延迟一段时间后执行 `fetchData` 函数,并返回一个Promise对象来处理异步结果。 注意,这里使用了箭头函数和展开运算符来传递参数,确保原始函数的参数能正确传递给防抖函数和回调函数。你可以根据实际需求进行调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值