Promise.finally 实现

手写 Promise.finally 方法

问题

从零实现 Promise.prototype.finally 方法。

解答

基本实现

Promise.prototype.myFinally = function (callback) {
  return this.then(
    // 成功时:执行回调,然后返回原值
    (value) => Promise.resolve(callback()).then(() => value),
    // 失败时:执行回调,然后抛出原错误
    (reason) =>
      Promise.resolve(callback()).then(() => {
        throw reason;
      })
  );
};

测试用例

// 测试成功情况
Promise.resolve(100)
  .myFinally(() => {
    console.log('finally 执行'); // 输出: finally 执行
  })
  .then((value) => {
    console.log('value:', value); // 输出: value: 100
  });

// 测试失败情况
Promise.reject(new Error('出错了'))
  .myFinally(() => {
    console.log('finally 执行'); // 输出: finally 执行
  })
  .catch((err) => {
    console.log('error:', err.message); // 输出: error: 出错了
  });

// 测试 callback 返回 Promise
Promise.resolve(200)
  .myFinally(() => {
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log('异步 finally'); // 1秒后输出
        resolve();
      }, 1000);
    });
  })
  .then((value) => {
    console.log('value:', value); // 输出: value: 200
  });

// 测试 callback 抛出错误
Promise.resolve(300)
  .myFinally(() => {
    throw new Error('finally 出错');
  })
  .catch((err) => {
    console.log('caught:', err.message); // 输出: caught: finally 出错
  });

关键点

  • finally 回调不接收任何参数
  • 成功时返回原值,失败时抛出原错误
  • Promise.resolve(callback()) 处理回调可能返回的 Promise
  • 如果 callback 抛出错误或返回 rejected Promise,会覆盖原结果