refactor(utils): add abort to resolveAfter

This commit is contained in:
Marek Polak
2025-02-05 16:52:59 +01:00
committed by Marek Polák
parent 447b22d6f2
commit fecb9a1ccc
2 changed files with 13 additions and 8 deletions

View File

@@ -1,11 +1,15 @@
import { createDeferred } from './createDeferred';
export const resolveAfter = <T = void>(msec: number, value?: T) => {
export const resolveAfter = <T = void>(msec: number, signal?: AbortSignal, value?: T) => {
const { promise, reject, resolve } = createDeferred<T>();
const timeout = setTimeout(resolve, msec, value);
return {
promise: promise.finally(() => clearTimeout(timeout)),
reject,
};
const onAbort = () => reject(signal?.reason);
signal?.addEventListener('abort', onAbort);
if (signal?.aborted) onAbort();
return promise.finally(() => {
clearTimeout(timeout);
signal?.removeEventListener('abort', onAbort);
});
};

View File

@@ -4,7 +4,7 @@ describe('resolveAfter', () => {
jest.useFakeTimers();
it('resolves after specified time', async () => {
const { promise } = resolveAfter(200, 'foo');
const promise = resolveAfter(200, undefined, 'foo');
jest.advanceTimersByTime(200);
@@ -12,10 +12,11 @@ describe('resolveAfter', () => {
});
it('rejects if the promise is rejected', async () => {
const { promise, reject } = resolveAfter(200);
const abort = new AbortController();
const promise = resolveAfter(200, abort.signal);
// Reject the promise after 100ms
setTimeout(() => reject(new Error('bar')), 100);
setTimeout(() => abort.abort(new Error('bar')), 100);
jest.advanceTimersByTime(100);