sisterAn/blog

Promise.prototype.finally 的作用,如何自己实现 Promise.prototype.finally

sisterAn opened this issue · 0 comments

Promise.prototype.finally() 的作用

Promise.prototype.finally() 是 ES2018 新增的特性,它回一个 Promise ,在 promise 结束时,无论 Promise 运行成功还是失败,都会运行 finally ,类似于我们常用的  try {...} catch {...} finally {...}

Promise.prototype.finally() 避免了同样的语句需要在 then()catch() 中各写一次的情况

new Promise((resolve, reject) => {
  setTimeout(() => resolve("result"), 2000)
})
  .then(result => console.log(result))
  .finally(() => console.log("Promise end"))

// result
// Promise end

reject :

new Promise((resolve, reject) => {
  throw new Error("error")
})
  .catch(err => console.log(err))
  .finally(() => console.log("Promise end"))

// Error: error
// Promise end

注意:

  • finally 没有参数
  • finally 会将结果和 error 传递
new Promise((resolve, reject) => {
  setTimeout(() => resolve("result"), 2000)
})
  .finally(() => console.log("Promise ready"))
  .then(result => console.log(result))

// Promise ready
// result

手写一个 Promise.prototype.finally()

不管 Promise 对象最后状态如何,都会执行的操作

MyPromise.prototype.finally = function (cb) {
  return this.then(function (value) {
    return MyPromise.resolve(cb()).then(function () {
      return value
    })
  }, function (err) {
    return MyPromise.resolve(cb()).then(function () {
      throw err
    })
  })
}