Beyond fetch, AbortSignal is now accepted by addEventListener, setTimeout, setInterval, and many Node APIs.
The cleanest pattern: pass a signal to the constructor of a long-lived helper, and cleanup is a single controller.abort() call. React’s useEffect teardown is the canonical place for this.
Listen for the abort event on the signal to perform any extra cleanup when cancellation happens.