Skip to content

Instantly share code, notes, and snippets.

@Jamesernator
Last active November 4, 2020 21:25
Show Gist options
  • Save Jamesernator/c04b2518617a8da6deb123e2dedc07be to your computer and use it in GitHub Desktop.
Save Jamesernator/c04b2518617a8da6deb123e2dedc07be to your computer and use it in GitHub Desktop.

Revisions

  1. Jamesernator revised this gist Nov 4, 2020. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions doAbortable.ts
    Original file line number Diff line number Diff line change
    @@ -12,6 +12,9 @@ export default async function doAbortable<R>(
    try {
    return await func(controller.signal);
    } finally {
    // remove listener from the original signal, this allows our local controller
    // to be collected as there are no longer any references to it, by consequence
    // this allows the inner signal to be collectable as long as no references remain
    signal?.removeEventListener("abort", abortInner);
    }
    }
  2. Jamesernator revised this gist Nov 4, 2020. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions doAbortable.ts
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    export default function doAbortable<R>(
    export default async function doAbortable<R>(
    signal: AbortSignal | undefined,
    func: (abortSignal: AbortSignal) => R,
    ): R {
    func: (abortSignal: AbortSignal) => R | Promise<R>,
    ): Promise<R> {
    const controller = new AbortController();
    const abortInner = () => controller.abort();
    if (signal?.aborted) {
    @@ -10,7 +10,7 @@ export default function doAbortable<R>(
    signal?.addEventListener("abort", abortInner, { once: true });
    }
    try {
    return func(controller.signal);
    return await func(controller.signal);
    } finally {
    signal?.removeEventListener("abort", abortInner);
    }
  3. Jamesernator created this gist Nov 4, 2020.
    17 changes: 17 additions & 0 deletions doAbortable.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,17 @@
    export default function doAbortable<R>(
    signal: AbortSignal | undefined,
    func: (abortSignal: AbortSignal) => R,
    ): R {
    const controller = new AbortController();
    const abortInner = () => controller.abort();
    if (signal?.aborted) {
    abortInner();
    } else {
    signal?.addEventListener("abort", abortInner, { once: true });
    }
    try {
    return func(controller.signal);
    } finally {
    signal?.removeEventListener("abort", abortInner);
    }
    }
    15 changes: 15 additions & 0 deletions example.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    import doAbortable from "./doAbortable.ts";
    import AbortError from "./AbortError.ts";

    export default function delay(time: number, abortSignal?: AbortSignal): Promise<void> {
    return doAbortable(abortSignal, abortSignal => {
    return new Promise((resolve, reject) => {
    if (abortSignal.aborted) { reject(new AbortError()) }
    const timeout = setTimeout(resolve, time);
    abortSignal.addEventListener('abort', () => {
    clearTimeout(timeout);
    reject(new AbortError());
    }, { once: true });
    });
    });
    }