首页 > 解决方案 > Promise 引发“未处理的承诺拒绝”错误的奇怪行为

问题描述

当我使用 Node 运行此代码时,它会Unhandled promise rejection在控制台中引发错误(甚至error caught首先显示文本)。

const promise = new Promise((resolve, reject) => setTimeout(reject, 1000))
promise.then(() => console.log('ok'))
promise.catch((e) => console.log('error caught'))

然而,当我将方法链接catchthen方法时,错误消失了:

const promise = new Promise((resolve, reject) => setTimeout(reject, 1000))
promise.then(() => console.log('ok')).catch((e) => console.log('error caught'))

第一个代码不是应该处理拒绝吗?

我还尝试了 Chrome 中的第一个代码,如果我在新标签(或 google.com)中打开检查器,它就可以工作。如果我在任何其他页面(如 stackoverflow.com)中,它会引发异常。对此有何解释?这对我来说真的很奇怪!

标签: javascriptnode.jspromisees6-promise

解决方案


为了被视为已处理,被拒绝的 Promise 应与then(..., ...)(2 个参数) 或catch(...).

promise.then(() => console.log('ok'))是一个单独的承诺,没有与 链接 catch(...),因此被拒绝的承诺将导致未处理的拒绝。

如果我在任何其他页面(如 stackoverflow.com)中,则会引发异常

这不是例外,它不会阻止脚本正常运行。处理未处理的拒绝的方式取决于Promise实施。默认情况下,Chrome 实现会导致Uncaught (in promise)控制台错误。

它没有出现在 Chrome 中的某些网站上意味着网站设置了抑制错误输出的unhandledrejection事件处理程序。


推荐阅读