广告
返回顶部
首页 > 资讯 > 精选 >ahooks怎么解决用户多次提交问题
  • 688
分享到

ahooks怎么解决用户多次提交问题

2023-07-02 17:07:01 688人浏览 薄情痞子
摘要

这篇文章主要介绍“ahooks怎么解决用户多次提交问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ahooks怎么解决用户多次提交问题”文章能帮助大家解决问题。场景试想一下,有这么一个场景,有一个

这篇文章主要介绍“ahooks怎么解决用户多次提交问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ahooks怎么解决用户多次提交问题”文章能帮助大家解决问题。

    场景

    试想一下,有这么一个场景,有一个表单,你可能多次提交,就很可能导致结果不正确。

    解决这类问题的方法有很多,比如添加 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 完成了自动取消重复请求的功能。

    关于“ahooks怎么解决用户多次提交问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: ahooks怎么解决用户多次提交问题

    本文链接: https://www.lsjlt.com/news/343225.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • ahooks怎么解决用户多次提交问题
      这篇文章主要介绍“ahooks怎么解决用户多次提交问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ahooks怎么解决用户多次提交问题”文章能帮助大家解决问题。场景试想一下,有这么一个场景,有一个...
      99+
      2023-07-02
    • ahooks解决用户多次提交方法示例
      目录引言场景useLockFn缺点axios 自动取消重复请求axios 取消请求如何自动取消重复的请求思考与总结引言 本文是深入浅出 ahooks 源码系列文章的第四篇,这个系列的...
      99+
      2022-11-13
    • Bootstrap模态框如何解决多次显示后台提交多次BUG的问题
      这篇文章主要介绍Bootstrap模态框如何解决多次显示后台提交多次BUG的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!BUG 情景使用场景触发展现模态框,填写对应的信息,然后...
      99+
      2022-10-19
    • Gitee提交报账户密码错误问题怎么解决
      这篇文章主要介绍“Gitee提交报账户密码错误问题怎么解决”,在日常操作中,相信很多人在Gitee提交报账户密码错误问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Gitee提交报账户密码错误问题怎...
      99+
      2023-07-05
    • 怎么解决jquery submit不提交问题
      这篇文章主要讲解了“怎么解决jquery submit不提交问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决jquery submit不提交问题”...
      99+
      2022-10-19
    • java怎么解决重复提交问题
      在Java中,可以通过以下几种方式来解决重复提交问题:1. 后端防重复提交:在后端服务器中通过生成并保存一个唯一的Token,将To...
      99+
      2023-08-19
      java
    • SpringBoot + Redis怎么解决重复提交问题
      这篇文章主要为大家展示了“SpringBoot + Redis怎么解决重复提交问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot + ...
      99+
      2023-06-22
    • redis表单重复提交问题怎么解决
      解决 Redis 表单重复提交问题可以通过以下几种方式:1. 使用 Redis 的原子性操作:在提交表单时,先通过 Redis 的 ...
      99+
      2023-09-11
      redis
    • MySQL游标多循环一次的问题怎么解决
      这篇文章主要讲解了“MySQL游标多循环一次的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL游标多循环一次的问题怎么解决”吧! ...
      99+
      2022-10-18
    • vue项目中created()被调用多次的问题怎么解决
      本文小编为大家详细介绍“vue项目中created()被调用多次的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中created()被调用多次的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
      99+
      2023-07-05
    • 怎么解决gitee提交文件错误的问题
      本篇内容主要讲解“怎么解决gitee提交文件错误的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决gitee提交文件错误的问题”吧!以下是一些常见的原因和解决方法:文件太大:如果你要上...
      99+
      2023-07-05
    • php怎么限定用户只能提交一次
      本文操作环境:Windows7系统、PHP7.1版、Dell G3电脑。php怎么限定用户只能提交一次?php限定post次数,比如一天只能post一次:第一,使用IP限制的话,你只能获得对方用户的外网IP,那么网吧里面所有电脑的IP是相同...
      99+
      2019-05-10
      php
    • 如何解决按钮触发Ajax请求时一次点击两次提交的问题
      这篇文章主要介绍了如何解决按钮触发Ajax请求时一次点击两次提交的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。页面中的按钮的type是...
      99+
      2022-10-19
    • docker容器非root用户提权的问题怎么解决
      这篇文章主要介绍“docker容器非root用户提权的问题怎么解决”,在日常操作中,相信很多人在docker容器非root用户提权的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker容器非...
      99+
      2023-06-30
    • 怎么解决navicat事务自动提交遇到的问题
      小编给大家分享一下怎么解决navicat事务自动提交遇到的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近在使用navic...
      99+
      2022-10-18
    • element自定义多文件上传触发多次on-change问题怎么解决
      这篇文章主要介绍“element自定义多文件上传触发多次on-change问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“element自定义多文件上传触发多次on-change问题怎么解...
      99+
      2023-07-05
    • git提交的用户名跟账户不一致怎么解决
      要解决git提交的用户名跟账户不一致的问题,可以按照以下步骤进行操作:1. 查看当前git配置的用户名和邮箱:在命令行中输入以下命令...
      99+
      2023-08-15
      git
    • Redis存储用户token问题怎么解决
      这篇文章主要介绍了Redis存储用户token问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis存储用户token问题怎么解决文章都会有所收获,下面我们一起来看看吧。Redis 存储用户tok...
      99+
      2023-07-05
    • WebGL与网页交互问题怎么解决
      今天小编给大家分享一下WebGL与网页交互问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。(一)首先说Unity调...
      99+
      2023-06-30
    • crontab每10秒执行一次问题怎么解决
      这篇文章主要介绍“crontab每10秒执行一次问题怎么解决”,在日常操作中,相信很多人在crontab每10秒执行一次问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”crontab每10秒执行一次...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作