finally

finally表示不是最终的意思,而是无论如何都会执行的意思

如果返回一个promise,会等待这个promise也执行完毕(如果是失败的promise, 会用他的失败原因传给下一个人)

# 用法

# promise成功态,无参数返回

Promise. resolve(123). finally((data) => {
  // finally 无参数
  console. log(data, 'finally')   // undefined finally
})

# promise成功态,会走向下一个then的成功回调

Promise. resolve(123). finally((data) => {
  console. log(data, 'finally')  // undefined finally
}). then(data => {
  console. log(data, 'success') // 123 'success'
})

# 如果promise失败状态,需要用catch来捕获错误

Promise. reject(123). finally((data) => {
  // finally 无参数
  console. log(data, 'finally')   // undefined. . 
}). catch(err => {
  console. log(err)  // 报错
})

# 如果返回一个promise,会等待这个promise先执行完毕

Promise. reject(123). finally((data) => {
  // finally 无参数
  console. log('finally') 
  return new Promise((resolve, reject) => {

    setTimeout(_ => {
      resolve('ok')
    }, 3000)

  })
}). then(data => {
  console. log(data, 'success')
}). catch(err => {
  console. log(err, 'err')  // 报错
})

立即执行输出 'finally',过3s输出 '123 err'

Promise. reject(123). finally((data) => {
  // finally 无参数
  console. log('finally') 
  return new Promise((resolve, reject) => {

    setTimeout(_ => {
      reject('ok')
    }, 3000)

  })
}). then(data => {
  console. log(data, 'success')
}). catch(err => {
  console. log(err, 'err')  // 报错
})

立即执行输出 'finally',过3s输出 'ok err'

# Promise. finally源码

Promise. finally核心

  1. 在Promise原型上挂载finally 方法
  2. Promise. finally实质是一个then方法类比Promise. resolve. then
  3. Promise. resolve(callback()),使用Promise. resolve会等callback的函数执行完再返回结果,并将上一个then的value返回
Promise. prototype. finally = function(callback) {
  return this. then((value) => {

    return Promise.resolve(callback()).then(() => value)

  }, (reason) => {

    return Promise.resolve(callback()).then(() => {throw reason})

  })
}