diff --git a/src/helpers/deferred.test.ts b/src/helpers/deferred.test.ts new file mode 100644 index 0000000..5e3ed31 --- /dev/null +++ b/src/helpers/deferred.test.ts @@ -0,0 +1,14 @@ +import test from "ava" +import { deferred } from "./deferred.js" + +test("resolve", async (t) => { + const d = deferred() + setTimeout(() => d.resolve("hi")) + t.is(await d, "hi") +}) + +test("reject", async (t) => { + const d = deferred() + setTimeout(() => d.reject(new Error("oops"))) + await t.throwsAsync(() => d, { instanceOf: Error, message: "oops" }) +}) diff --git a/src/helpers/deferred.ts b/src/helpers/deferred.ts new file mode 100644 index 0000000..3d89e93 --- /dev/null +++ b/src/helpers/deferred.ts @@ -0,0 +1,20 @@ +export type Deferred = PromiseLike & { + resolve: (value: T | PromiseLike) => void + reject: (reason?: unknown) => void +} + +export function deferred(): Deferred { + let resolve: (value: T | PromiseLike) => void + let reject: (reason?: unknown) => void + + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve + reject = _reject + }) + + return { + then: promise.then.bind(promise), + resolve: (value) => resolve(value), + reject: (reason) => reject(reason), + } +}