在一些点击操作场景时,用户可能手误多次点击,就会造成发多次请求的情况。为了避免这种情况,我们需要等待此轮请求发送完毕后,再可以下次点击。
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 = true
try{
const res = await fn(...args)
flagRef = false
return res
}catch(e){
flagRef = false
throw e
}
},[fn])
}
export default function App() {
const fn = useLockFn(async ()=>{
const res = await sleep(1000)
})
return (
<div className="App">
<button onClick={fn}}>关注</button>
</div>
);
}