NOTE: This document describes APIs that provide support to external debugging tools. Do not use these APIs in application code.
The following APIs allow debugging tools to receive information about promise errors. For example, when.js uses them in its builtin unhandled rejection reporting feature, as well as in when/monitor/console to display long async stack traces.
A debugger could use them to do any number of things, such as display a list of "currently unhandled promise rejections", or send error reports to an error aggregation service.
Perhaps the best example is when.js's default implementation, which logs to the console in when/lib/decorators/unhandledRejection.
The following example shows how to combine Promise.onPotentiallyUnhandledRejection and Promise.onPotentiallyUnhandledRejectionHandled to implement a simple debug UI:
var Promise = require('when').Promise;
Promise.onPotentiallyUnhandledRejection = function(rejection) {
addToDebugDisplay(rejection.id, rejection.value);
}
Promise.onPotentiallyUnhandledRejection = function(rejection) {
removeFromDebugDisplay(rejection.id);
}
function addToDebugDisplay(id, error) {
// Add to custom debug UI here
}
function removeFromDebugDisplay(id) {
// Remove from custom debug UI here
}Called for each rejected promise that appears not to have been handled. An rejection descriptor is provided as the argument:
{
id: <unique id of the rejection>
value: <the rejection's reason>
// may contain other, internal/bookkeeping fields
}
Technically, this is called after the internal task queue has been flushed, for each rejected promise that hasn't yet been observed, for example by calling its .then or .catch methods.
The default implementation in when/lib/decorators/unhandledRejection logs error information to console.error that includes the id.
Called when a rejection previously passed to Promise.onPotentiallyUnhandledRejection becomes handled, for example if it is observed later by calling its .then or .catch methods.
It is passed the same rejection descriptor object as Promise.onPotentiallyUnhandledRejection.
The default implementation in when/lib/decorators/unhandledRejection logs an additional message to console.log with the id indicating that the rejection has been handled.
Called when an error propagates out of a terminal promise.done, for example, if a callback passed to promise.done throws an exception.
The default implementation in when/lib/decorators/unhandledRejection throws an uncatchable exception that will be logged to console.error by browsers and will halt (crash) node.js.
Called for every newly created internal promise descriptor.
A debugger may use this as an opportunity to record information about or to attach information to the new record. For example, when/monitor/console uses this to record stack frame information which it uses to recreate long async stack traces.
The default implementation in when/lib/decorators/unhandledRejection is a noop.
Called just before control is transferred to a promise callback. It is passed the promise descriptor of the associated promise.
A debugger may use this to record information before control enters the callback. For example, when/monitor/console uses this to push stack frame information which it uses to recreate long async stack traces.
The default implementation in when/lib/decorators/unhandledRejection is a noop.
Called just after control returns from promise callback. It is passed the promise descriptor of the associated promise.
A debugger may use this to record information after control exits the callback. For example, when/monitor/console uses this to pop stack frame information which it previously pushed via Promise.enterContext.
The default implementation in when/lib/decorators/unhandledRejection is a noop.