Promise.then 的错误处理

分析 Promise.reject 在 then 方法中的错误处理流程

问题

下面代码的输出是什么?

Promise.reject('err!!!')
  .then((res) => {
    console.log('success', res)
  }, (err) => {
    console.log('error', err)
  }).catch(err => {
    console.log('catch', err)
  })

解答

.then() 方法接收两个参数:

  • 第一个参数:处理 Promise 成功状态的回调函数
  • 第二个参数:处理 Promise 失败状态的回调函数

当 Promise 状态为 rejected 时,会直接进入 .then() 的第二个参数(错误处理函数),而不会继续传递到后面的 .catch()

因此,Promise.reject('err!!!') 的值会被 .then() 的第二个参数捕获并处理。

输出结果:

error err!!!

关键点

  • .then() 的第二个参数可以捕获 Promise 的 rejected 状态
  • 如果 .then() 的第二个参数已经处理了错误,.catch() 不会再执行
  • .catch(err => {}) 等价于 .then(null, err => {})
  • 只有当 .then() 没有提供错误处理函数时,错误才会传递到 .catch()