Promise的怪异行为引发“未处理的承诺拒绝”错误

时间:2018-09-03 18:39:32

标签: javascript node.js promise es6-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'))

尽管如此,当我将catch方法链接到then方法时,错误消失了:

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)中,则会引发异常。有什么解释吗?这对我来说真的很奇怪!

1 个答案:

答案 0 :(得分:2)

为了被视为已处理,被拒绝的诺言应与then(..., ...)(2个参数)或catch(...)同步链接。

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

  

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

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

在Chrome的某些网站中未出现该符号,表示该网站设置了unhandledrejection event处理程序以禁止错误输出。