summaryrefslogtreecommitdiff
path: root/util/deferred.ts
blob: f52087547a88eb67cf2c285c3dd24d9a66337a2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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"
  );
}