• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共299篇

    前端 - Javascript

关闭

返回栏目

关闭

返回前端 - Javascript栏目

143 - Promise 对象 - Promise 方法 - finally 方法的特点

作者:

贺及楼

成为作者

更新日期:2025-02-21 20:06:44

Promise 对象 - Promise 方法 - finally 方法的特点

在 JavaScript 的异步编程中,Promise 对象是一个非常重要的概念。它为我们处理异步操作提供了一种优雅且强大的方式,避免了回调地狱的问题。而 finally 方法作为 Promise 对象的一个重要方法,具有一些独特的特点,下面我们就来详细探讨一下。

基本语法和使用场景

finally 方法用于在 Promise 结束时,无论其状态是 fulfilled(已成功)还是 rejected(已失败),都会执行的操作。其基本语法如下:

  1. promise.finally(onFinally);

其中,promise 是一个 Promise 对象,onFinally 是一个回调函数,当 Promise 状态改变时,该回调函数就会被调用。

下面是一个简单的示例:

  1. function getData() {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. const randomNumber = Math.random();
  5. if (randomNumber > 0.5) {
  6. resolve('Data fetched successfully');
  7. } else {
  8. reject(new Error('Failed to fetch data'));
  9. }
  10. }, 1000);
  11. });
  12. }
  13. getData()
  14. .then(result => console.log(result))
  15. .catch(error => console.error(error))
  16. .finally(() => console.log('This will always be executed'));

在这个示例中,getData 函数返回一个 Promise 对象,该 Promise 对象在 1 秒后根据随机数的值决定是成功还是失败。无论最终状态如何,finally 方法中的回调函数都会被执行。

finally 方法的特点

1. 无论 Promise 状态如何都会执行

finally 方法的最大特点就是无论 Promise 的最终状态是 fulfilled 还是 rejected,它的回调函数都会被执行。这在一些需要进行清理操作的场景中非常有用,比如关闭网络连接、释放资源等。

  1. function openConnection() {
  2. console.log('Connection opened');
  3. return new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. const randomNumber = Math.random();
  6. if (randomNumber > 0.5) {
  7. resolve('Operation completed successfully');
  8. } else {
  9. reject(new Error('Operation failed'));
  10. }
  11. }, 1000);
  12. });
  13. }
  14. openConnection()
  15. .then(result => console.log(result))
  16. .catch(error => console.error(error))
  17. .finally(() => console.log('Connection closed'));

在这个示例中,无论 openConnection 返回的 Promise 是成功还是失败,finally 方法都会确保连接被关闭。

2. 不接收 Promise 的状态值

finally 方法的回调函数不接收 Promise 的状态值(即 resolvereject 的参数)。这意味着在 finally 方法中无法直接获取 Promise 的结果。

  1. const promise = new Promise((resolve, reject) => {
  2. resolve('Success');
  3. });
  4. promise.finally(() => {
  5. // 这里无法获取 Promise 的结果
  6. console.log('Finally block executed');
  7. })
  8. .then(result => console.log(result));

3. 会传递 Promise 的状态

finally 方法返回一个新的 Promise,该 Promise 的状态与原 Promise 相同。也就是说,如果原 Promise 是 fulfilled 状态,finally 方法返回的 Promise 也是 fulfilled 状态;如果原 Promise 是 rejected 状态,finally 方法返回的 Promise 也是 rejected 状态。

  1. const fulfilledPromise = Promise.resolve('Success');
  2. const rejectedPromise = Promise.reject(new Error('Failure'));
  3. fulfilledPromise.finally(() => console.log('Finally block for fulfilled promise'))
  4. .then(result => console.log(result)); // 输出: Success
  5. rejectedPromise.finally(() => console.log('Finally block for rejected promise'))
  6. .catch(error => console.error(error)); // 输出: Error: Failure

4. 可以链式调用

finally 方法可以与 thencatch 方法一起进行链式调用,使代码更加简洁和易读。

  1. function asyncOperation() {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. resolve('Async operation completed');
  5. }, 1000);
  6. });
  7. }
  8. asyncOperation()
  9. .then(result => {
  10. console.log(result);
  11. return result.toUpperCase();
  12. })
  13. .then(upperCaseResult => console.log(upperCaseResult))
  14. .catch(error => console.error(error))
  15. .finally(() => console.log('Chain ended'));

总结

特点 描述
无论状态如何都会执行 不管 Promise 最终是 fulfilled 还是 rejectedfinally 方法的回调函数都会执行
不接收状态值 回调函数不接收 Promise 的状态值
传递 Promise 状态 finally 方法返回的 Promise 状态与原 Promise 相同
可链式调用 可以与 thencatch 方法一起进行链式调用

通过了解和掌握 finally 方法的这些特点,我们可以更加灵活地处理异步操作,编写出更加健壮和可靠的 JavaScript 代码。