当我使用Node运行此代码时,它会Unhandled promise rejection在控制台中引发错误(甚至error caught首先显示文本)。
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方法时,错误消失了:
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)中打开检查器时,该代码就可以使用。如果我在其他任何页面中,则会引发异常。有什么解释吗?这对我来说真的很奇怪!
为了被视为已处理,被拒绝的诺言应与then(..., ...)(2个参数)或同步链接catch(...)。
then(..., ...)
catch(...)
promise.then(() => console.log('ok'))是未与链接的单独承诺 catch(...),因此被拒绝的承诺将导致未处理的拒绝。
promise.then(() => console.log('ok'))
如果我在其他任何页面(例如stackoverflow.com)中,则会引发异常
这不是一个例外,它不会阻止脚本正常运行。处理未处理拒绝的方式取决于Promise实现。Chrome实施Uncaught (in promise)默认会导致控制台错误。
Promise
Uncaught (in promise)
如果它没有出现在Chrome的某些网站中,则意味着网站设置了unhandledrejection事件处理程序来抑制错误输出。
unhandledrejection