mirror of
https://github.com/trezor/trezor-suite.git
synced 2026-03-03 05:55:03 +01:00
refactor(utils): add abort to resolveAfter
This commit is contained in:
@@ -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);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user