ECMAScript 2018(ES9)中新增加的 Promise.prototype.finally() 方法的详解

在 ECMAScript 2018 中,新增加了 Promise.prototype.finally() 方法,它是对 Promise 函数的完善,使得在实现异步操作时更加方便灵活。这篇文章将对 Promise.prototype.finally() 方法进行详细解析,并提供一些相关的示例代码。

Promise 的基本原理

Promise 是一种异步操作的解决方案,它可以避免回调地狱的问题。一个 Promise 对象代表一个异步操作,它有三种状态:pending(等待状态)、fulfilled(完成状态)、rejected(拒绝状态)。

在 Promise 中,我们一般使用then() 方法来处理异步操作完成时的结果,或者使用catch() 方法来处理异步操作失败时的异常。Promise.prototype.then() 方法的作用是为 Promise 实例添加处理异步操作成功的回调函数。而 Promise.prototype.catch() 方法则是为 Promise 实例添加处理异步操作失败的回调函数。

例如,下面的示例代码展示了使用 Promise 方法处理异步操作的基本流程:

function fetchUserData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = {
        name: 'Tom',
        age: 25
      };
      if (data) {
        resolve(data);
      } else {
        reject(new Error('Data not found'));
      }
    }, 2000);
  });
}

fetchUserData()
  .then(data => {
    console.log('Data:', data);
  })
  .catch(error => {
    console.log('Error:', error);
  });

执行以上代码时,会先等待 2 秒,然后输出以下结果:

Promise.prototype.finally() 方法的详解

Promise.prototype.finally() 方法是 Promise 方法的一种新的操作方式,它允许我们在 Promise 执行完成时执行一些必要的清理工作,例如关闭数据库连接、释放资源等等。该方法的语法如下:

promise.finally(onFinally);

其中,promise 表示需要执行的 Promise 对象,onFinally 表示该 Promise 对象执行完成时需要执行的操作。

Promise.prototype.finally() 方法返回的 Promise 对象 resolves 的值是上一个 Promise 对象的结果(包括 Promise 对象本身或值)或拒绝的原因(不包括 Promise 对象本身或值)。

下面的示例代码展示了 Promise.prototype.finally() 方法的基本使用:

Promise.resolve('data')
  .then(data => {
    console.log(data);
  })
  .finally(() => {
    console.log('finally');
  })
  .catch(error => {
    console.log(error);
  });

输出以下结果:

从上面的示例代码我们可以看到,不管 Promise 对象是否成功,无论这个 Promise 对象在执行过程中发生了什么异常,都会执行 finally() 方法内部的代码。

Promise.prototype.finally() 方法的一个优点是它比 try...catch...finally 更加简单明了,可以更好地在代码中使用。

示例代码

下面是一个关于 Promise.prototype.finally() 方法的示例代码:

// 定义一个异步操作
function asyncFunc() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = {
        message: 'Promise Complete'
      };
      reject(new Error('Promise Failed'));
    }, 1000);
  });
}

// 执行异步操作
asyncFunc()
  .then(result => {
    console.log('Resolved:', result);
  })
  .catch(error => {
    console.log('Rejected:', error);
  })
  .finally(() => {
    console.log('Clean Up');
  });

执行以上代码,输出以下结果:

从上面的代码可以看出,即使 Promise 操作失败了,finally() 方法内部的代码也会被执行。

总结

本文对 ECMAScript 2018 中的 Promise.prototype.finally() 方法进行了详细介绍,并提供了相关的示例代码。通过对该方法的学习,我们可以更加灵活地处理 Promise 异步操作,同时也可以更加方便地管理程序资源。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659f5957add4f0e0ff800bd0


纠错反馈