Path: blob/main/files/en-us/web/api/abortsignal/index.md
6543 views
------{{APIRef("DOM")}}
The AbortSignal interface represents a signal object that allows you to communicate with a DOM request (such as a fetch request) and abort it if required via an {{domxref("AbortController")}} object.
{{InheritanceDiagram}}
Instance properties
The AbortSignal interface may also inherit properties from its parent interface, {{domxref("EventTarget")}}.
{{domxref("AbortSignal.aborted")}} {{ReadOnlyInline}}
: A {{Glossary("Boolean")}} that indicates whether the request(s) the signal is communicating with is/are aborted (
true) or not (false).
{{domxref("AbortSignal.reason")}} {{ReadOnlyInline}}
: A JavaScript value providing the abort reason, once the signal has aborted.
Static methods
{{domxref("AbortSignal.abort()")}}
: Returns an
AbortSignalinstance that is already set as aborted.
{{domxref("AbortSignal.timeout()")}}
: Returns an
AbortSignalinstance that will automatically abort after a specified time.
Instance methods
The AbortSignal interface may also inherit methods from its parent interface, {{domxref("EventTarget")}}.
{{domxref("AbortSignal.throwIfAborted()")}}
: Throws the signal's abort {{domxref("AbortSignal.reason", "reason")}} if the signal has been aborted; otherwise it does nothing.
Events
Listen to this event using addEventListener() or by assigning an event listener to the oneventname property of this interface.
: Invoked when the DOM requests the signal is communicating with is/are aborted. Also available via the
onabortproperty.
Examples
Aborting a fetch operation using an explicit signal
The following snippet shows how we might use a signal to abort downloading a video using the Fetch API.
We first create an abort controller using the {{domxref("AbortController.AbortController","AbortController()")}} constructor, then grab a reference to its associated {{domxref("AbortSignal")}} object using the {{domxref("AbortController.signal")}} property.
When the fetch request is initiated, we pass in the AbortSignal as an option inside the request's options object (the {signal} below). This associates the signal and controller with the fetch request, and allows us to abort it by calling {{domxref("AbortController.abort()")}}. Below you can see that the fetch operation is aborted in the second event listener, which triggered when the abort button (abortBtn) is clicked.
Note: When
abort()is called, thefetch()promise rejects with an "AbortError"DOMException.
You can find a full working example on GitHub; you can also see it running live.
Aborting a fetch operation with a timeout
If you need to abort the operation on timeout then you can use the static {{domxref("AbortSignal.timeout()")}} method. This returns an AbortSignal that will automatically timeout after a certain number of milliseconds.
The code snippet below shows how you would either succeed in downloading a file, or handle a timeout error after 5 seconds. Note that when there is a timeout the fetch() promise rejects with a "TimeoutError" DOMException. This allows code to differentiate between timeouts (for which user notification is probably required), and user aborts.
Aborting a fetch with timeout or explicit abort
fetch() isn't designed to combine multiple signals, so you can't abort a download "directly" due to either of {{domxref("AbortController.abort()")}} being called or an AbortSignal timeout (though as in the preceding example, a timeout signal will abort if triggered by inbuilt browser mechanisms like a stop button).
To trigger on multiple signals they must be daisy chained. The code snippet below shows how you might call {{domxref("AbortController.abort()")}} in the handler for a separate timer.
Note: Unlike when using {{domxref("AbortSignal.timeout()")}}, there is no way to tell whether the final abort was caused by a timeout.
Specifications
{{Specifications}}
Browser compatibility
{{Compat}}
See also
Abortable Fetch by Jake Archibald