JS에서 비동기 작업을 취소할 수 있도록 만든 공식 표준 API -> fetch, stream, timer, custom async 함수 모두 취소 가능
핵심 구성 요소는 두 가지
const controller = new AbortController();
const signal = controller.signal;
controller.abort(); // 취소 신호 발생
예를 들어, fetch 요청을 취소할 수 있음
const controller = new AbortController();
const signal = controller.signal;
fetch('/api/data', { signal })
.then((res) => res.json())
.catch((err) => {
if (err.name === 'AbortError') {
console.log('요청이 취소됨');
}
});
// 200ms 후 강제 취소
setTimeout(() => controller.abort(), 200);
-> 응답이 오기 전에 네트워크 연결을 끊고, -> fetch는 즉시 Reject 되며, -> 소켓도 clean-up 됨
AbortSignal은 비동기 함수들이 취소 상태를 관찰하는 통일된 구조다
async function longTask(signal) {
for (let i = 0; i < 10000; i++) {
if (signal.aborted) throw new Error('Aborted');
await doSomething(i);
}
}
function withTimeout(promise, ms) {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), ms);
return fetch(promise, { signal: controller.signal }).finally(() =>
clearTimeout(timeout),
);
}