diff options
| author | Yusuke Sakurai <kerokerokerop@gmail.com> | 2019-02-16 01:03:57 +0900 |
|---|---|---|
| committer | Ryan Dahl <ry@tinyclouds.org> | 2019-02-15 11:03:57 -0500 |
| commit | 57f4e6a86448263c9f1c75934e829e048c76f572 (patch) | |
| tree | b4e46dcb4a43fec2694e289702fba2cd5e475c50 /util | |
| parent | 34ece9f2ede9c63af2678feb15ef5290a74c8d2f (diff) | |
Redesign of http server module (denoland/deno_std#188)
Original: https://github.com/denoland/deno_std/commit/8569f15207bdc12c2c8ca81e9d020955be54918b
Diffstat (limited to 'util')
| -rw-r--r-- | util/deferred.ts | 42 | ||||
| -rw-r--r-- | util/deferred_test.ts | 16 |
2 files changed, 58 insertions, 0 deletions
diff --git a/util/deferred.ts b/util/deferred.ts new file mode 100644 index 000000000..f52087547 --- /dev/null +++ b/util/deferred.ts @@ -0,0 +1,42 @@ +// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. + +export type Deferred<T = any, R = Error> = { + promise: Promise<T>; + resolve: (t?: T) => void; + reject: (r?: R) => void; + readonly handled: boolean; +}; + +/** Create deferred promise that can be resolved and rejected by outside */ +export function defer<T>(): Deferred<T> { + let handled = false; + let resolve; + let reject; + const promise = new Promise<T>((res, rej) => { + resolve = r => { + handled = true; + res(r); + }; + reject = r => { + handled = true; + rej(r); + }; + }); + return { + promise, + resolve, + reject, + get handled() { + return handled; + } + }; +} + +export function isDeferred(x): x is Deferred { + return ( + typeof x === "object" && + x.promise instanceof Promise && + typeof x["resolve"] === "function" && + typeof x["reject"] === "function" + ); +} diff --git a/util/deferred_test.ts b/util/deferred_test.ts new file mode 100644 index 000000000..a397b3012 --- /dev/null +++ b/util/deferred_test.ts @@ -0,0 +1,16 @@ +// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. + +import { assert, test } from "../testing/mod.ts"; +import { defer, isDeferred } from "./deferred.ts"; + +test(async function asyncIsDeferred() { + const d = defer(); + assert.assert(isDeferred(d)); + assert.assert( + isDeferred({ + promise: null, + resolve: () => {}, + reject: () => {} + }) === false + ); +}); |
