처음에는 axios.CancelToken로 구현을 했다가, Axios에 찾아보니 deprecated라고 해서 AbortController로 새로 구현했다.
pending statefulfilled 되기까지 기다리지 않고 계속해서 새로운 요청을 보내서 요청이 쌓임API 요청에는 axios와 redux-saga, 상태관리는 redux와 redux-toolkit 사용
// 현재 요청이 아니라 이전 요청을 취소해야 하기 때문에 closure로 fetchData 함수 scope 밖에 선언
import axios from "axios";
import { call, put, takeLatest } from "@redux-saga/core/effects";
import { startLoading, putDataToStore } from "/redux/slices";
let ctrller;
function* fetchSaga() {
if (ctrller) {
ctrller.abort(); // 이전 요청을 취소. 따라서 최초에는 abort할 것이 없음.
}
// Create a new AbortController
ctrller = new AbortController(); // 새로운 요청을 위한 AbortController 생성
try {
yield put(startLoading()); // 로딩 시작
const res = yield call(axios.get("some-url.com", {
signal: ctrller.signal
});
// status !== 200인 경우 및 !data.resource인 경우 핸들링 생략
yield put(putDataToStore(res.data.resource));
} catch (error) {
if (error.name === 'AbortError') {
console.log('API request was aborted');
} else {
console.log(error);
}
} finally {
yield put(startLoading());
}
};
export function* watchDataSaga() {
yield takeLatest(fetchStart, fetchDataSaga);
}
컴포넌트에서 사용 예시
const dispatch = useDispatch();
dispatch(fetchStart()); // abort
dispatch(fetchStart()); // abort
dispatch(fetchStart()); // good to go!

다 취소되고 마지막 요청만 실제 응답을 받아볼 수 있다.
참고하면 좋은 글
MDN: AbortController
Axios Docs: Cancellation
Kakao Tech: Promise는 왜 취소가 안 될까?