react-solid-flow
Version:
[SolidJS](https://www.solidjs.com/docs/latest/api#control-flow)-inspired basic control-flow components and everyday async state hook library for [React](https://reactjs.org/)
30 lines (28 loc) • 890 B
text/typescript
interface PauseOpts {
signal?: AbortSignal
}
/**
* Promisified abortable timeout.
* @param timeout timeout duration in ms
* @param [opts.signal] optional AbortController
* @returns Promise, resolved when timeout is passed, rejected if aborted (in the same way as fetch() is)
*/
export function pause(timeout: number, { signal }: PauseOpts = {}) {
return new Promise<void>((res, rej) => {
const to = setTimeout(() => {
if (typeof signal?.removeEventListener === "function") {
signal.removeEventListener("abort", abortHandler);
}
res();
}, timeout);
function abortHandler(this: AbortSignal) {
if (to) {
clearTimeout(to);
}
rej(this.reason);
}
if (typeof signal?.addEventListener === "function") {
signal.addEventListener("abort", abortHandler, { once: true });
}
});
}