1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Add support for canceling a delay

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-02-24 15:40:50 -05:00
parent 9704598e92
commit 5591c59f26

View File

@ -4,6 +4,8 @@
*/ */
import type AbortController from "abort-controller"; import type AbortController from "abort-controller";
import type { Disposer } from "./disposer";
import { disposer } from "./disposer";
/** /**
* Return a promise that will be resolved after at least `timeout` ms have * Return a promise that will be resolved after at least `timeout` ms have
@ -12,13 +14,22 @@ import type AbortController from "abort-controller";
* @param timeout The number of milliseconds before resolving * @param timeout The number of milliseconds before resolving
* @param failFast An abort controller instance to cause the delay to short-circuit * @param failFast An abort controller instance to cause the delay to short-circuit
*/ */
export function delay(timeout = 1000, failFast?: AbortController): Promise<void> { export function delay(timeout = 1000, failFast?: AbortController): Promise<void> & { cancel: Disposer } {
return new Promise(resolve => { const cancel = disposer();
return Object.assign(new Promise<void>(resolve => {
const timeoutId = setTimeout(resolve, timeout); const timeoutId = setTimeout(resolve, timeout);
failFast?.signal.addEventListener("abort", () => { cancel.push(() => clearTimeout(timeoutId));
clearTimeout(timeoutId);
resolve(); if (failFast) {
}); const onAbort = () => {
}); clearTimeout(timeoutId);
resolve();
};
failFast.signal.addEventListener("abort", onAbort);
cancel.push(() => failFast.signal.removeEventListener("abort", onAbort));
}
}), { cancel });
} }