
理解rejectionhandled事件的关键在于其触发条件:一个promise被拒绝,且这个拒绝没有被任何catch语句捕获。 因此,要触发此事件,我们需要创建一个被拒绝的promise,并且不使用catch来处理它的拒绝。
你的代码中已经注册了rejectionhandled事件监听器:
<code class="javascript">window.addEventListener("rejectionhandled", event => {
console.log("Promise rejected; reason: " + event.reason);
}, false);</code>但缺少关键步骤:创建一个被拒绝的Promise。 以下代码演示如何做到这一点:
<code class="javascript">const rejectedPromise = Promise.reject("这是一个被拒绝的Promise"); </code>rejectedPromise现在处于被拒绝状态。 因为没有catch处理它,当事件循环进入下一个宏任务阶段时,rejectionhandled事件就会被触发。
需要注意的是:
立即学习“Java免费学习笔记(深入)”;
宏任务队列: rejectionhandled事件仅在Promise进入宏任务队列后才会触发。 这意味着在同步代码或微任务(例如Promise.then)中直接拒绝的Promise不会触发该事件。
我愿意把本文归入我的“编程糗事”系列。尽管在正规大学课程中,接触到软件工程、企业级软件架构和数据库设计,但我还是时不时地体会到下述事实带给我的“罪恶”感,当然,都是我的主观感受,并且面向Eclipse: 你是PHP菜鸟,如果你: 1. 不会利用如phpDoc这样的工具来恰当地注释你的代码 2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见 3
379
catch语句: 如果你的Promise使用了.catch()方法来处理错误,那么rejectionhandled事件就不会触发,因为错误已经被捕获了。
测试案例: 你提供的测试代码中,Promise.resolve(1).then(...)和Promise.resolve(1).then(...).catch(...)都不会触发rejectionhandled,因为它们是已完成的Promise,或者使用了catch处理了潜在的错误。 而使用setTimeout包裹的Promise,由于在宏任务队列中执行,才会触发rejectionhandled。
为了更清晰地说明,可以修改你的测试代码,使其明确地拒绝一个Promise,并且不使用catch来处理:
<code class="javascript">const rejectedPromise = Promise.reject("这是一个测试错误");
setTimeout(() => {
// 这里rejectedPromise在宏任务中被访问,因此rejectionhandled事件会被触发
}, 100);</code>通过以上修改,你就能可靠地触发并观察rejectionhandled事件了。
以上就是如何触发JavaScript中的rejectionhandled事件?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号