
正确触发rejectionhandled事件的技巧
rejectionhandled 事件在 Promise 被拒绝,且没有 catch 块捕获时触发。要成功触发此事件,请注意以下关键点:
-
异步环境:事件必须在宏任务(例如
setTimeout或setInterval)执行完毕后触发,同步代码或微任务(Promise.then)中无法触发。 -
未被捕获的拒绝:Promise 必须处于拒绝状态,且没有使用
catch方法处理该拒绝。
常见错误及排查
根据经验,以下情况容易导致 rejectionhandled 事件无法触发:
- 在浏览器控制台中直接执行代码:控制台环境与实际运行环境不同,无法可靠地触发该事件。
- 在同步代码或微任务中触发:必须在宏任务执行完成后才能触发。
-
使用了
catch块:catch块会捕获 Promise 的拒绝,阻止rejectionhandled事件的触发。
示例代码:演示如何正确触发事件
我愿意把本文归入我的“编程糗事”系列。尽管在正规大学课程中,接触到软件工程、企业级软件架构和数据库设计,但我还是时不时地体会到下述事实带给我的“罪恶”感,当然,都是我的主观感受,并且面向Eclipse: 你是PHP菜鸟,如果你: 1. 不会利用如phpDoc这样的工具来恰当地注释你的代码 2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见 3
以下代码演示了在满足所有条件的情况下,如何正确触发 rejectionhandled 事件:
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error("Promise Rejected!"));
}, 200); // 使用setTimeout确保异步执行
});
window.addEventListener('rejectionhandled', (event) => {
console.log('Rejection Handled:', event.reason); // 输出错误信息
});
// 故意不使用catch,让Promise拒绝不被捕获
setTimeout(() => {
myPromise.then(result => console.log("Promise resolved:", result));
}, 100); // 确保在Promise拒绝后才执行
在这个例子中,rejectionhandled 事件会在 200 毫秒后触发,因为 Promise 被拒绝且没有被 catch 处理。 setTimeout 的使用确保了事件在宏任务环境下触发。









