'unhandledRejection' 事件
当 Promise
被拒绝且在事件循环的此次轮询中没有绑定错误句柄时,则会触发 'unhandledRejection
事件。
当使用 Promise 进行编程时,异常会被封装为“被拒绝的 promise”。
拒绝可以被 promise.catch()
捕获并处理,并且在 Promise
链中传播。
'unhandledRejection
事件在检测和跟踪被拒绝的(且拒绝还未被处理)promise 时很有用。
process.on('unhandledRejection', (reason, promise) => {
console.log('未处理的拒绝:', promise, '原因:', reason);
// 记录日志、抛出错误、或其他逻辑。
});
somePromise.then((res) => {
return reportToUser(JSON.pasre(res)); // 故意输错 (`pasre`)。
}); // 没有 `.catch()` 或 `.then()`。
以下代码也会触发 'unhandledRejection'
事件:
function SomeResource() {
// 设置 loaded 的状态为被拒绝的 promise。
this.loaded = Promise.reject(new Error('错误信息'));
}
const resource = new SomeResource();
// resource.loaded 上没有 .catch 或 .then。
在此示例中,可以像其他 'unhandledRejection'
事件一样,将拒绝作为开发者错误进行跟踪。
为了解决此类故障,可以在 resource.loaded
上绑定一个无操作的 .catch(() => { })
句柄,这样就可以阻止 'unhandledRejection'
事件的触发。
reason
<Error> | <any> The object with which the promise was rejected (typically anError
object).promise
<Promise> The rejected promise.
The 'unhandledRejection'
event is emitted whenever a Promise
is rejected and
no error handler is attached to the promise within a turn of the event loop.
When programming with Promises, exceptions are encapsulated as "rejected
promises". Rejections can be caught and handled using promise.catch()
and
are propagated through a Promise
chain. The 'unhandledRejection'
event is
useful for detecting and keeping track of promises that were rejected whose
rejections have not yet been handled.
process.on('unhandledRejection', (reason, promise) => {
console.log('Unhandled Rejection at:', promise, 'reason:', reason);
// Application specific logging, throwing an error, or other logic here
});
somePromise.then((res) => {
return reportToUser(JSON.pasre(res)); // Note the typo (`pasre`)
}); // No `.catch()` or `.then()`
The following will also trigger the 'unhandledRejection'
event to be
emitted:
function SomeResource() {
// Initially set the loaded status to a rejected promise
this.loaded = Promise.reject(new Error('Resource not yet loaded!'));
}
const resource = new SomeResource();
// no .catch or .then on resource.loaded for at least a turn
In this example case, it is possible to track the rejection as a developer error
as would typically be the case for other 'unhandledRejection'
events. To
address such failures, a non-operational
.catch(() => { })
handler may be attached to
resource.loaded
, which would prevent the 'unhandledRejection'
event from
being emitted.