在一些点击操作场景时,用户可能手误多次点击,就会造成发多次请求的情况。为了避免这种情况,我们需要等待此轮请求发送完毕后,再可以下次点击。

    1. const sleep = (ms)=> new Promise((resolve) => setTimeout(()=> resolve(1), ms))
    2. const useLockFn = async (fn)=>{
    3. const flag = React.useRef(false)
    4. const flagRef = flag.current
    5. // 运用闭包特性,返回一个新函数并执行fn返回结果
    6. return React.useCallback(async (...args)=>{
    7. if(flagRef) return;
    8. flagRef = true
    9. try{
    10. const res = await fn(...args)
    11. flagRef = false
    12. return res
    13. }catch(e){
    14. flagRef = false
    15. throw e
    16. }
    17. },[fn])
    18. }
    19. export default function App() {
    20. const fn = useLockFn(async ()=>{
    21. const res = await sleep(1000)
    22. })
    23. return (
    24. <div className="App">
    25. <button onClick={fn}}>关注</button>
    26. </div>
    27. );
    28. }