AbortSignal.timeout in Axios: Modern HTTP Timeouts
Managing request timeouts is critical for building resilient
applications, and modern versions of Axios support the standardized
AbortSignal.timeout() method to handle request
cancellation. This approach replaces or complements the legacy
timeout configuration by utilizing the native Web and
Node.js standard AbortSignal API. By reading this guide,
you will understand how AbortSignal.timeout() functions
within Axios, why it improves request lifecycle management, and how to
implement it effectively.
What is
AbortSignal.timeout()?
AbortSignal.timeout(ms) is a native JavaScript method
that returns an AbortSignal instance which automatically
triggers an abort event after a specified number of milliseconds. It
eliminates the boilerplate of creating an AbortController,
calling setTimeout, and manually invoking
controller.abort().
Implementing
AbortSignal.timeout() in Axios
Axios supports the standard signal property in its
request configuration. Passing AbortSignal.timeout()
directly into this property enforces a strict deadline for the network
operation.
import axios from 'axios';
async function fetchData() {
try {
const response = await axios.get('https://api.example.com/data', {
signal: AbortSignal.timeout(5000) // Automatically cancels after 5 seconds
});
console.log(response.data);
} catch (error) {
if (axios.isCancel(error)) {
console.error('Request timed out or was aborted:', error.message);
} else {
console.error('An unexpected error occurred:', error.message);
}
}
}AbortSignal.timeout()
vs. Axios Legacy timeout
Axios has long provided a built-in timeout property in
its config object. While both approaches terminate slow requests,
AbortSignal.timeout() offers distinct advantages in modern
runtimes:
- Standardization:
AbortSignalis a platform-wide standard across the Fetch API, Node.js, and browser APIs. Using it in Axios aligns your code with standard JavaScript patterns. - Resource Cleanup: Native signals immediately tear down underlying network sockets and stream readers at the runtime level.
- Composability: You can combine multiple
cancellation triggers using
AbortSignal.any(). For instance, you can abort a request if either a timeout occurs OR the user clicks a "Cancel" button:
const userController = new AbortController();
const timeoutSignal = AbortSignal.timeout(5000);
// Aborts if user cancels OR if 5 seconds elapse
const combinedSignal = AbortSignal.any([userController.signal, timeoutSignal]);
await axios.get('https://api.example.com/data', { signal: combinedSignal });Error Handling
When a request is aborted due to AbortSignal.timeout(),
Axios rejects the promise with a cancellation error. In modern
environments, the underlying cause is typically a
TimeoutError DOMException. You can detect this using
axios.isCancel(error) or by inspecting
error.name:
try {
await axios.get('/endpoint', { signal: AbortSignal.timeout(3000) });
} catch (error) {
if (error.name === 'CanceledError' || error.name === 'TimeoutError') {
// Handle timeout specifically
}
}Using AbortSignal.timeout() provides a robust, native,
and standardized mechanism to prevent hanging requests in modern Axios
implementations.