ES2017/ES8 中的 Promise.prototype.finally()

在 ES2017/ES8 中,Promise 对象新增了一个方法 finally(),用于指定不管 Promise 对象最终状态如何,都会执行的操作。在这篇文章中,我们将深入探讨 finally() 方法的使用方法和指导意义。

Promise 的基础知识

在深入探讨 finally() 方法之前,我们需要先了解 Promise 的基础知识。Promise 是一种异步编程的解决方案,它可以让我们更方便地处理异步操作。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。当 Promise 对象的状态从 pending 转变为 fulfilledrejected 时,我们称之为 Promise 对象被“解决(settled)”。

Promise 对象的基本用法如下:

const promise = new Promise((resolve, reject) => {
  // 异步操作
  if (/* 异步操作成功 */) {
    resolve(value); // 将 Promise 对象的状态设置为 fulfilled,并返回一个 value 值
  } else {
    reject(error); // 将 Promise 对象的状态设置为 rejected,并返回一个 error 值
  }
});

promise.then(value => {
  // Promise 对象被解决,并且状态为 fulfilled
}).catch(error => {
  // Promise 对象被解决,并且状态为 rejected
});

Promise.prototype.finally() 的使用方法

finally() 方法可以用于指定在 Promise 对象被解决(settled)后,无论其状态是 fulfilled 还是 rejected,都会执行的操作。finally() 方法接受一个回调函数作为参数,这个回调函数在 Promise 对象被解决后会被调用。这个回调函数不接受任何参数,也不会改变 Promise 对象的状态。

finally() 方法的使用方法如下:

promise
  .then(value => {
    // Promise 对象被解决,并且状态为 fulfilled
  })
  .catch(error => {
    // Promise 对象被解决,并且状态为 rejected
  })
  .finally(() => {
    // 无论 Promise 对象的状态如何,都会执行的操作
  });

Promise.prototype.finally() 的指导意义

finally() 方法的主要作用是在 Promise 对象被解决后执行一些清理操作,例如关闭资源、取消订阅等。finally() 方法还可以用于在 Promise 对象被解决后执行一些通知操作,例如向用户显示一个提示信息。

finally() 方法的另一个指导意义是可以避免代码重复。在以前的版本中,我们通常需要在 then()catch() 方法中分别执行一些代码,例如关闭资源。使用 finally() 方法可以避免这种重复代码的出现。

Promise.prototype.finally() 的示例代码

下面是一个使用 finally() 方法的示例代码。这个代码使用 Promise 对象模拟了一个异步操作,然后使用 finally() 方法在 Promise 对象被解决后执行了一些清理操作。

function simulateAsyncOperation() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const randomNumber = Math.random();
      if (randomNumber > 0.5) {
        resolve(randomNumber);
      } else {
        reject(new Error('Random number is less than 0.5'));
      }
    }, 1000);
  });
}

simulateAsyncOperation()
  .then(value => {
    console.log(`Async operation succeeded with value ${value}`);
  })
  .catch(error => {
    console.error(`Async operation failed with error ${error.message}`);
  })
  .finally(() => {
    console.log('Cleaning up resources...');
  });

总结

在 ES2017/ES8 中,Promise 对象新增了一个方法 finally(),用于指定在 Promise 对象被解决后执行的操作。finally() 方法的主要作用是在 Promise 对象被解决后执行一些清理操作,避免代码重复。finally() 方法的使用方法非常简单,只需要在 then()catch() 方法后面添加一个 finally() 方法即可。

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