diff options
Diffstat (limited to 'js/promise_util.ts')
-rw-r--r-- | js/promise_util.ts | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/js/promise_util.ts b/js/promise_util.ts new file mode 100644 index 000000000..a550bc388 --- /dev/null +++ b/js/promise_util.ts @@ -0,0 +1,46 @@ +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; +} |