deferred helper, might be useful

This commit is contained in:
MapleLeaf
2021-12-08 01:02:41 -06:00
parent 197c24ad01
commit abdf88fdc9
2 changed files with 34 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
import test from "ava"
import { deferred } from "./deferred.js"
test("resolve", async (t) => {
const d = deferred<string>()
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" })
})

20
src/helpers/deferred.ts Normal file
View File

@@ -0,0 +1,20 @@
export type Deferred<T> = PromiseLike<T> & {
resolve: (value: T | PromiseLike<T>) => void
reject: (reason?: unknown) => void
}
export function deferred<T = void>(): Deferred<T> {
let resolve: (value: T | PromiseLike<T>) => void
let reject: (reason?: unknown) => void
const promise = new Promise<T>((_resolve, _reject) => {
resolve = _resolve
reject = _reject
})
return {
then: promise.then.bind(promise),
resolve: (value) => resolve(value),
reject: (reason) => reject(reason),
}
}