Works with browsers, NodeJS (16+), and spec-compliant polyfills.
import { createDeadline } from "abortcontroller-deadline";
// create an AbortController which aborts after 500 ms
const controller = createDeadline(500);
// use the controller! in this case, it ensures the fetch takes no longer than 500ms
try {
const response = await fetch("https://example.com", {
signal: controller.signal,
});
const data = await response.json();
} catch (error) {
if (error instanceof fetch.AbortError) {
console.log("Deadline exceeded");
}
}
You can chain the output of other AbortSignals into the deadline: if any of the signals aborts before the deadline, the deadline controller will be aborted too:
const parentController = new AbortController();
const anotherController = new AbortController();
// if either parentController or anotherController abort, deadlineController
// will also abort, even if 500ms haven't passed
const deadlineController = createDeadline(
500,
parentController.signal,
anotherController.signal
);
Internally, the deadline is triggered by a timeout (from setTimeout()
). While not required, it is a good practice to clean up any unused timeouts.
createDeadline()
manages this by adding a clearDeadline()
to any returned controller:
import { createDeadline } from "abortcontroller-deadline";
const controller = createDeadline(500);
try {
const response = await fetch("https://example.com", {
signal: controller.signal,
});
/* ... */
} catch (error) {
/* ... */
} finally {
// clean up; this works whether or not the deadline occured
controller.clearDeadline();
}