Promise 监听拒绝状态

浏览器环境(window)的拒绝状态监听事件

  • unhandledrejection 当 Promise 被拒绝,并且没有提供拒绝处理程序时,触发该事件。
  • rejectionhandled 当 Promise 被拒绝时,若拒绝处理程序被调用,触发该事件。

window.addEventListener('unhandledrejection', e => {
  console.log('unhandledrejection', e.reason.message) // I am an unhandledrejection Error!
})
window.addEventListener('rejectionhandled', e => {
  console.log('rejectionhandled', e.reason.message) // I am an rejectionhandled Error!
})

// 触发拒绝
const p1 = Promise.reject(new Error('I am an unhandledrejection Error!'))
const p2 = Promise.reject(new Error('I am an rejectionhandled Error!'))

// rejectionhandled 尚未生效,添加延时程序
setTimeout(() => {
  p2.catch(e => {
    console.log('catch', e.message)
  })
}, 3000)

跟踪并处理程序中拒绝状态

// 初始化列表
const unhandledRejections = new Map()
// 监听未处理拒绝状态
window.addEventListener('unhandledrejection', e => {
  unhandledRejections.set(e.promise, e.reason)
})
// 监听已处理拒绝状态
window.addEventListener('rejectionhandled', e => {
  unhandledRejections.delete(e.promise)
})
// 循环处理拒绝状态
setInterval(() => {
  unhandledRejections.forEach((reason, promise) => {
    console.log('handle: ', reason.message)
    promise.catch(e => {
      console.log(`I catch u!`, e.message)
    })
  })
  unhandledRejections.clear()
}, 5000)

// 触发拒绝
const p1 = Promise.reject(new Error('I am an unhandledrejection Error!'))

相关笔记

发表评论

您的电子邮箱地址不会被公开。