abortable
import { abortable } from "jsr:@ende/async/unstable-abortable";function · experimental
function abortable<T>(p: Promise<T>, signal: AbortSignal | AbortableOptions): Promise<T>Make a Promise abortable with the given signal.
p: Promise<T>The promise to make abortable.
signal: AbortSignal | AbortableOptionsThe signal to abort the promise with, or an
AbortableOptionsobject carrying an optional signal.
Returns
A promise that can be aborted.
Example: Error-handling a timeout
import { abortable } from "@ende/async/unstable-abortable";
import { delay } from "@ende/async/delay";
import { assertRejects, assertEquals } from "@ende/assert";
const promise = delay(1_000);
// Rejects with `DOMException` (name `"TimeoutError"`) after 100 ms
const error = await assertRejects(
() => abortable(promise, AbortSignal.timeout(100)),
DOMException,
);
assertEquals(error.name, "TimeoutError");
Example: Error-handling an abort
import { abortable } from "@ende/async/unstable-abortable";
import { delay } from "@ende/async/delay";
import { assertRejects, assertEquals } from "@ende/assert";
const promise = delay(1_000);
const controller = new AbortController();
controller.abort(new Error("This is my reason"));
// Rejects with `DOMException` immediately
await assertRejects(
() => abortable(promise, controller.signal),
Error,
"This is my reason"
);
Example: Passing an optional signal through options
import { abortable } from "@ende/async/unstable-abortable";
import { assertEquals } from "@ende/assert";
async function process(options: { signal?: AbortSignal } = {}) {
return await abortable(Promise.resolve("Hello"), options);
}
// Without a signal, the promise resolves as usual
assertEquals(await process(), "Hello");
function · experimental
function abortable<T>(p: AsyncIterable<T>, signal: AbortSignal | AbortableOptions): AsyncGenerator<T>Make an AsyncIterable abortable with the given signal.
p: AsyncIterable<T>The async iterable to make abortable.
signal: AbortSignal | AbortableOptionsThe signal to abort the iteration with, or an
AbortableOptionsobject carrying an optional signal.
Returns
An async iterable that can be aborted.
Example: Error-handling a timeout
import { abortable } from "@ende/async/unstable-abortable";
import { delay } from "@ende/async/delay";
import { assertRejects, assertEquals } from "@ende/assert";
const asyncIter = async function* () {
yield "Hello";
await delay(1_000);
yield "World";
};
const items: string[] = [];
// Below throws `DOMException` (name `"TimeoutError"`) after 100 ms and items
// become `["Hello"]`
const error = await assertRejects(
async () => {
for await (const item of abortable(asyncIter(), AbortSignal.timeout(100))) {
items.push(item);
}
},
DOMException,
);
assertEquals(error.name, "TimeoutError");
assertEquals(items, ["Hello"]);
Example: Error-handling an abort
import { abortable } from "@ende/async/unstable-abortable";
import { delay } from "@ende/async/delay";
import { assertRejects, assertEquals } from "@ende/assert";
const asyncIter = async function* () {
yield "Hello";
await delay(1_000);
yield "World";
};
const controller = new AbortController();
controller.abort(new Error("This is my reason"));
const items: string[] = [];
// Below throws `DOMException` immediately
await assertRejects(
async () => {
for await (const item of abortable(asyncIter(), controller.signal)) {
items.push(item);
}
},
Error,
"This is my reason"
);
assertEquals(items, []);
Example: Passing an optional signal through options
import { abortable } from "@ende/async/unstable-abortable";
import { assertEquals } from "@ende/assert";
const asyncIter = async function* () {
yield "Hello";
yield "World";
};
// Without a signal, iteration proceeds as usual
const items = await Array.fromAsync(abortable(asyncIter(), {}));
assertEquals(items, ["Hello", "World"]);
function · experimental
function abortable<T>(p: Promise<T> | AsyncIterable<T>, signal: AbortSignal | AbortableOptions): Promise<T> | AsyncGenerator<T>