There’s a special built-in object for such purposes: AbortController
. It can be used to abort not only fetch
, but other asynchronous tasks as well.
The usage is very straightforward:
Create a controller:
let controller = new AbortController();
A controller is an extremely simple object.
abort()
,signal
that allows to set event listeners on it.When abort()
is called:
controller.signal
emits the "abort"
event.controller.signal.aborted
property becomes true
.Generally, we have two parties in the process:
controller.signal
.controller.abort()
when needed.When a fetch is aborted, its promise rejects with an error AbortError
, so we should handle it, e.g. in try..catch
.
Fetch메소드를 실행시키면 promise로 관리.
let controller = new AbortController();
let signal = controller.signal;
// The party that performs a cancelable operation
// gets the "signal" object
// and sets the listener to trigger when controller.abort() is called
signal.addEventListener('abort', () => alert("abort!"));
// The other party, that cancels (at any point later):
controller.abort(); // abort!
// The event triggers and signal.aborted becomes true
alert(signal.aborted); // true
with the fetch()
// abort in 1 second
let controller = new AbortController();
setTimeout(() => controller.abort(), 1000);
try {
let response = await fetch('/article/fetch-abort/demo/hang', {
signal: controller.signal
});
} catch(err) {
if (err.name == 'AbortError') { // handle abort()
alert("Aborted!");
} else {
throw err;
}
}