From 45d3b8955de628db0ef051eeb8e351837b4a3b3e Mon Sep 17 00:00:00 2001 From: "Kevin (Kun) \"Kassimo\" Qian" Date: Fri, 12 Oct 2018 11:22:52 -0700 Subject: Fix promise reject issue (#936) --- js/promise_util.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 js/promise_util.ts (limited to 'js/promise_util.ts') 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, string>(); +// For uncaught promise rejection errors + +/* tslint:disable-next-line:no-any */ +const otherErrorMap = new Map, 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 +) { + 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; +} -- cgit v1.2.3