实现useLockFn

884 阅读1分钟

自定义hooks

作为react的使用者,自定义hooks是常见的业务需求,小弟技术水平有限,只能先借花献佛聊下公司里大佬们封装的自定义hooks了

import { useRef, useCallback } from 'react';

/**
 * 用于给一个异步函数增加竞态锁,防止并发执行。
 * @param fn
 * @returns
 */
export function useLockFn<P extends any[] = any[], V = 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);
        lockRef.current = false;
        return ret;
      } catch (e) {
        lockRef.current = false;
        throw e;
      }
    },
    [fn]
  );
}

用于给一个异步函数增加竞态锁,防止并发执行。

用法如下

import React, { useState } from 'react';
import { useLockFn } from '@pansy/react-hooks';
import { message, Button } from 'antd';

function mockApiRequest() {
  return new Promise<void>((resolve) => {
    setTimeout(() => {
      resolve();
    }, 2000);
  });
}

export default () => {
  const [count, setCount] = useState(0);

  const submit = useLockFn(async () => {
    message.info('Start to submit');
    await mockApiRequest();
    setCount((val) => val + 1);
    message.success('Submit finished');
  });

  return (
    <>
      <p>Submit count: {count}</p>
      <Button onClick={submit}>Submit</Button>
    </>
  );
};

个人的分享记录,不喜勿喷。