在一些点击操作场景时,用户可能手误多次点击,就会造成发多次请求的情况。为了避免这种情况,我们需要等待此轮请求发送完毕后,再可以下次点击。
const sleep = (ms)=> new Promise((resolve) => setTimeout(()=> resolve(1), ms))const useLockFn = async (fn)=>{const flag = React.useRef(false)const flagRef = flag.current// 运用闭包特性,返回一个新函数并执行fn返回结果return React.useCallback(async (...args)=>{if(flagRef) return;flagRef = truetry{const res = await fn(...args)flagRef = falsereturn res}catch(e){flagRef = falsethrow e}},[fn])}export default function App() {const fn = useLockFn(async ()=>{const res = await sleep(1000)})return (<div className="App"><button onClick={fn}}>关注</button></div>);}
