summaryrefslogtreecommitdiff
path: root/js/promise_util.ts
blob: 1b9c2ab249f8daf5c72d5c249aa9687b4a3fb603 (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
43
44
45
46
47
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
import { PromiseRejectEvent } from "./libdeno";

/* tslint:disable-next-line:no-any */
const rejectMap = new Map<Promise<any>, string>();
// For uncaught promise rejection errors

/* tslint:disable-next-line:no-any */
const otherErrorMap = new Map<Promise<any>, string>();
// For reject after resolve / resolve after resolve errors

export function promiseRejectHandler(
  error: Error | string,
  event: PromiseRejectEvent,
  /* tslint:disable-next-line:no-any */
  promise: Promise<any>
) {
  switch (event) {
    case "RejectWithNoHandler":
      rejectMap.set(promise, (error as Error).stack || "RejectWithNoHandler");
      break;
    case "HandlerAddedAfterReject":
      rejectMap.delete(promise);
      break;
    default:
      // error is string here
      otherErrorMap.set(promise, `Promise warning: ${error as string}`);
  }
}

// Return true when continue, false to die on uncaught promise reject
export function promiseErrorExaminer(): boolean {
  if (otherErrorMap.size > 0) {
    for (const msg of otherErrorMap.values()) {
      console.log(msg);
    }
    otherErrorMap.clear();
  }
  if (rejectMap.size > 0) {
    for (const msg of rejectMap.values()) {
      console.log(msg);
    }
    rejectMap.clear();
    return false;
  }
  return true;
}