axios는 요청을 취소할 수 있는 CancelToken을 제공한다.
1 2 3 4 5 6 cancelToken = axios.CancelToken.source(); axios.get(url, { cancelToken : cancelToken.token }); cancelToken.cancel();
토큰을 생성하여 axios의 config에 넣어주면 된다. 그 후 토큰의 cancel()
메서드를 호출하면 된다.
아래의 코드는 리액트에서 사용한다고 가정하고 예시로 작성해본 코드이다..!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 const Example = () => { const ref = useRef(); const handleRequest = async () => { try { ref.current = axios.CancelToken.source(); const data = await axios.get( url, { data :{/.../ }, cancelToken : ref.current.token, }); } catch (e) { if (error.response) { console .error(error.response.message); } else if (error.request) { console .error("request is failed!" ); } else if (axios.isCancel(error)) { console .log("request is cancled!" ); } } }; }; const handleRequestCancel=()=> { res.current.cancel(); } return ( <> <button onClick ={handleRequest} > 요청</button > <button onClick ={handleRequestCancel} > 취소</button > </> )
마지막 요청만 서버로 보내는 디바운싱과 함께 적용하면 요청을 효율적으로 관리할 수 있을 것 같다.
디바운싱을 적용하여 간단하게 작성해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 const Example = () => { const ref = useRef(); const timer=useRef(); const handleRequest = () => { if (timer.current){ clearTimeout (timer); } const newTimer=setTimeout (async ()=>{ try { ref.current = axios.CancelToken.source(); const data = await axios.get( url, { data :{/.../ }, cancelToken : ref.current.token, }); } catch (e) { if (error.response) { console .error(error.response.message); } else if (error.request) { console .error("request is failed!" ); } else if (axios.isCancel(error)) { console .log("request is cancled!" ); } } }; },1300 ) timer.current=(newTimer) }; const handleRequestCancel=()=> { res.current.cancel(); } return ( <> <button onClick ={handleRequest} > 요청</button > <button onClick ={handleRequestCancel} > 취소</button > </> )
다음에 진행할 프로젝트에 꼭 한 번 적용해보고 싶다!
ref axios 러닝 가이드