标签导航:

如何触发JavaScript中的rejectionhandled事件?

理解rejectionhandled事件的关键在于其触发条件:一个promise被拒绝,且这个拒绝没有被任何catch语句捕获。 因此,要触发此事件,我们需要创建一个被拒绝的promise,并且不使用catch来处理它的拒绝。

你的代码中已经注册了rejectionhandled事件监听器:

window.addEventListener("rejectionhandled", event => {
  console.log("Promise rejected; reason: " + event.reason);
}, false);

但缺少关键步骤:创建一个被拒绝的Promise。 以下代码演示如何做到这一点:

const rejectedPromise = Promise.reject("这是一个被拒绝的Promise"); 

rejectedPromise现在处于被拒绝状态。 因为没有catch处理它,当事件循环进入下一个宏任务阶段时,rejectionhandled事件就会被触发。

需要注意的是:

  • 宏任务队列: rejectionhandled事件仅在Promise进入宏任务队列后才会触发。 这意味着在同步代码或微任务(例如Promise.then)中直接拒绝的Promise不会触发该事件。

  • catch语句: 如果你的Promise使用了.catch()方法来处理错误,那么rejectionhandled事件就不会触发,因为错误已经被捕获了。

  • 测试案例: 你提供的测试代码中,Promise.resolve(1).then(...)和Promise.resolve(1).then(...).catch(...)都不会触发rejectionhandled,因为它们是已完成的Promise,或者使用了catch处理了潜在的错误。 而使用setTimeout包裹的Promise,由于在宏任务队列中执行,才会触发rejectionhandled。

为了更清晰地说明,可以修改你的测试代码,使其明确地拒绝一个Promise,并且不使用catch来处理:

const rejectedPromise = Promise.reject("这是一个测试错误");

setTimeout(() => {
  // 这里rejectedPromise在宏任务中被访问,因此rejectionhandled事件会被触发
}, 100);

通过以上修改,你就能可靠地触发并观察rejectionhandled事件了。