PromiseRejectionEvent触发是否与reject参数是原始值还是Error类型有关?
问题现象解释
你观察到的unhandledrejection事件触发差异和reject参数类型无关,是浏览器开发者控制台的日志过滤规则导致的,两种场景下事件都会正常触发。
核心原因
- 规范层面明确要求:只要Promise进入rejected状态且没有绑定对应的catch处理函数,无论
reject()传入的是Error实例还是字符串、数字等原始类型,都会触发unhandledrejection事件,不存在类型区分的触发逻辑。 - 控制台输出差异来自日志分级规则:
主流浏览器(Chrome、Edge等)默认对不同日志做了分级展示:- 当
reject传入Error实例时,浏览器会优先输出这个未处理Error的堆栈信息,你在unhandledrejection回调中写的console.log日志会被归类为「Verbose(详细)」级别,默认隐藏不展示,所以你看不到事件触发的打印内容 - 当
reject传入字符串等非Error类型值时,对应的console.log日志会被归类为「Info」级别,默认直接展示,所以你能看到事件触发的输出
- 当
验证方法
你可以通过两种方式确认Code1中的事件确实触发:
- 打开浏览器控制台的日志级别筛选菜单,勾选「Verbose」选项,重新运行Code1即可看到两行
unhandledrejection的打印内容 - 将事件回调中的
console.log替换为console.error,重新运行后日志会以Error级别输出,默认直接展示
测试代码参考
CODE 1
function unhandledrejection(event) { console.log("unhandledrejection: ", event.promise); console.log("unhandledrejection: ", event.reason); } window.addEventListener('unhandledrejection', unhandledrejection); var promise = new Promise((resolve, reject)=>reject(new Error("Oops"))); promise.then(value=>console.log(value));
CODE 2
var promise = new Promise((resolve, reject)=>reject("result")); promise.then(value=>console.log(value));
内容的提问来源于stack exchange,提问作者Lone Mayson
相关产品推荐
相关产品推荐

