abort-utils
Version:
Utility functions to use and combine `AbortSignal` and `AbortController` with Promises
29 lines (28 loc) • 991 B
JavaScript
/* eslint-disable @typescript-eslint/prefer-promise-reject-errors, promise/prefer-catch, promise/prefer-await-to-then */
async function promiseRaceWithSignal(promise, signal, { abortRejects = true } = {}) {
if (!signal) {
return promise;
}
const trueSignal = signal instanceof AbortController ? signal.signal : signal;
if (abortRejects) {
trueSignal.throwIfAborted();
}
else if (trueSignal.aborted) {
return trueSignal.reason;
}
return new Promise((resolve, reject) => {
const handleAbort = () => {
if (abortRejects) {
reject(trueSignal.reason);
}
else {
resolve(trueSignal.reason);
}
};
trueSignal.addEventListener('abort', handleAbort, { once: true });
promise.then(resolve, reject).finally(() => {
trueSignal.removeEventListener('abort', handleAbort);
});
});
}
export { promiseRaceWithSignal };