diff --git a/lib/internal/process/promises.js b/lib/internal/process/promises.js index 22f1959784be9a..563517c94e2936 100644 --- a/lib/internal/process/promises.js +++ b/lib/internal/process/promises.js @@ -2,7 +2,9 @@ const promiseRejectEvent = process._promiseRejectEvent; const hasBeenNotifiedProperty = new WeakMap(); +const promiseToGuidProperty = new WeakMap(); const pendingUnhandledRejections = []; +let lastPromiseId = 1; exports.setup = setupPromises; @@ -18,6 +20,7 @@ function setupPromises(scheduleMicrotasks) { function unhandledRejection(promise, reason) { hasBeenNotifiedProperty.set(promise, false); + promiseToGuidProperty.set(promise, lastPromiseId++); addPendingUnhandledRejection(promise, reason); } @@ -25,9 +28,15 @@ function setupPromises(scheduleMicrotasks) { var hasBeenNotified = hasBeenNotifiedProperty.get(promise); if (hasBeenNotified !== undefined) { hasBeenNotifiedProperty.delete(promise); + const uid = promiseToGuidProperty.get(promise); + promiseToGuidProperty.delete(promise); if (hasBeenNotified === true) { process.nextTick(function() { - process.emit('rejectionHandled', promise); + if(!process.emit('rejectionHandled', promise)) { + process.emitWarning('Promise Rejection Handled Asynchronously' + + '(rejection id: ' + uid +') ', + 'PromiseRejectionHandledWarning'); + } }); } @@ -35,15 +44,18 @@ function setupPromises(scheduleMicrotasks) { } function emitPendingUnhandledRejections() { - var hadListeners = false; + let hadListeners = false; while (pendingUnhandledRejections.length > 0) { - var promise = pendingUnhandledRejections.shift(); - var reason = pendingUnhandledRejections.shift(); + const promise = pendingUnhandledRejections.shift(); + const reason = pendingUnhandledRejections.shift(); if (hasBeenNotifiedProperty.get(promise) === false) { hasBeenNotifiedProperty.set(promise, true); + const uid = promiseToGuidProperty.get(promise); if (!process.emit('unhandledRejection', reason, promise)) { - // Nobody is listening. - // TODO(petkaantonov) Take some default action, see #830 + process.emitWarning('Possibly unhandled promise rejection ' + + '(rejection id: ' + uid +'): ' + + reason, + 'UnhandledPromiseRejectionWarning'); } else { hadListeners = true; }