The addEventListener() method accepts an optional object of options as its third argument. If you set the signal property, you can remove all event listeners.
/**
*
* @param {number} delay
* @param {AbortSignal} [abortSignal]
* @returns {Promise<void>}
*/
export default function timeoutPromise(delay, abortSignal) {
return new Promise((resolve, reject) => {
if(abortSignal) {
abortSignal.throwIfAborted();
}
const clearController = new AbortController();
const timeout = setTimeout(() => {
clearController.abort();
resolve();
}, delay);
abortSignal.addEventListener("abort", () => {
clearController.abort();
clearTimeout(timeout);
reject(new Error("Aborted"));
}, {
signal: clearController.signal
});
});
}