前端 按钮 loading效果阻断不了快速点击,执行防抖操作进行阻断接口连续调用

需求描述:
页面中执行了按钮的连续点击操作,虽然前端在按钮中加了loading效果,但是发现,如果点击速度很快,那么loading效果来不及赋值并执行,此时就会出现连续的接口调用造成数据保存或流程数据出现错误或重复数据新增。
此时用防抖解决。

封装如下:

import { request as iceRequest } from 'ice';
import _ from 'lodash';

function debounceAsync(func, wait) {
  let timeout;

  return async function (...args) {
    clearTimeout(timeout);

    return new Promise((resolve) => {
      timeout = setTimeout(async () => {
        const result = await func(...args);
        resolve(result);
      }, wait);
    });
  };
}

const request = (url: string, option) => {
  if (option.method) {
    if (option.method.toUpperCase() === 'GET' && option.query) {
      option.params = option.query;
    }
    if (['POST', 'PUT', 'DELETE', 'PATCH'].includes(option.method.toUpperCase()) && option.query) {
      option.data = option.query;
    }
  }
  return iceRequest({
    url,
    ...option,
  });
};


const debounceRequestFn = (url: string, option, delay = 500) => {
  if (option.method) {
    if (option.method.toUpperCase() === 'GET' && option.query) {
      option.params = option.query;
    }
    if (['POST', 'PUT', 'DELETE', 'PATCH'].includes(option.method.toUpperCase()) && option.query) {
      option.data = option.query;
    }
  }
  return iceRequest({
    url,
    ...option,
  });
};

export default request;

const debounceRequest = debounceAsync(async function (url: string, option, delay = 500) {
  const response = await debounceRequestFn(url, option, delay);
  return response
}, 300)

export {
  debounceRequest
}

然后 在页面中引用方法即可

import request from '@/utils/request';
import debounceRequest from '@/utils/request';
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值