详解 Promise 中的 finally 方法及其作用

Promise 是前端中常用的一种异步编程的方式,它能够让我们更加高效地处理异步函数返回的结果。而 Promise 中的 finally() 方法则是 Promise 对象提供的一个特殊方法,用于指定当 Promise 对象执行完成后,无论它成功或失败都会被执行的回调函数。在本文中,我们将详解 finally() 方法的特点和使用场景,并提供一些实用的代码示例。

finally() 方法的特点

在了解 finally() 方法之前,我们先来回顾一下 Promise 的基本结构:

let promise = new Promise(function(resolve, reject) {
  // 一些异步操作代码
});

我们可以看到,Promise 构造函数需要传递一个函数作为参数,这个函数包含 resolvereject 两个参数。当异步操作执行成功时,我们需要调用 resolve() 方法来处理结果,而当执行失败时,我们则需要调用 reject() 方法。接下来,我们就可以使用 then() 方法来处理成功时的结果,以及使用 catch() 方法来处理失败时的结果。

在这个基础上,finally() 方法被加入到了 Promise 对象中,它的基本语法为:

promise.finally(function() {
  // 无论成功或失败都会执行的回调函数
})

从这个语法中,我们可以看出 finally() 方法的几个特点:

  1. finally() 方法接受一个回调函数作为参数,这个回调函数不接收任何参数。
  2. 这个回调函数将在 Promise 对象执行完成后被执行,无论它是成功还是失败。
  3. finally() 方法返回的是一个新的 Promise 对象,它的结果是执行成功或失败后原 Promise 对象的结果。

基于以上特点,我们可以看出 finally() 方法主要有两个作用:

  1. 在 Promise 对象执行完毕后,执行一些无论成功或失败都需要执行的操作。
  2. finally() 方法中添加额外的 then()catch() 方法来处理 finally() 方法执行完成后的结果。

finally() 方法的使用场景

finally() 方法的应用场景也比较广泛,这里我们举几个例子加以说明:

场景一:清除加载中的页面元素

在前端开发中,我们经常要做一些异步加载的操作。当我们在加载一些比较大的数据或者一些静态资源时,这个加载过程可能会需要一定的时间。为了给用户更好的交互体验,我们一般会在页面上添加一些加载中的元素,如 loading 图标,进度条等等。当异步操作完成后,我们需要将这些加载元素清除掉。而 finally() 方法则可以方便我们实现这个功能,因为在清除元素的操作中,我们不需要考虑异步执行成功还是失败,都应该将加载元素清除掉。下面是一个示例代码:

let loadingElement = document.querySelector('#loading');
loadingElement.style.display = 'block'; // 显示加载元素

fetch(url)
  .then(response => {
    // 处理请求结果
  })
  .catch(error => {
    // 处理请求错误
  })
  .finally(() => {
    loadingElement.style.display = 'none'; // 隐藏加载元素
  })

在这个代码中,我们通过 fetch 函数获取数据,当这个异步请求成功或失败后都会调用 finally() 方法的回调函数来隐藏加载元素。

场景二:释放系统资源

通常情况下,我们在执行一些系统级别的操作时,比如打开一个文件、连接数据库等操作,系统在执行完成后会返回给应用程序一些资源,如文件句柄、数据库连接等。而我们需要在使用完这些资源后,将它们释放掉。在 Promise 的异步操作中,我们可以使用 finally() 方法来确保这个资源一定会被释放。下面是一个示例代码:

function openFile(filename) {
  return new Promise((resolve, reject) => {
    const file = new File(filename);
    file.open(err => {
      if (err) {
        reject(err);
      } else {
        resolve(file);
      }
    });
  })
}

openFile('test.txt')
  .then(file => {
    // 处理文件内容
    console.log(file.read());
    return file;
  })
  .catch(error => {
    // 处理文件打开失败的情况
  })
  .finally(() => {
    file.close(); // 释放文件资源
  })

在这个示例代码中,我们打开一个文件,当文件打开成功后,我们使用 then() 方法来处理文件读取操作,而在使用完文件资源后,我们则在 finally() 方法中释放这个文件句柄。

总结

finally() 方法是 Promise 中提供的一个特殊方法,它可以在 Promise 对象执行完成之后,无论成功或失败,都执行一个回调函数。finally() 的主要作用是执行一些与异步执行状态无关的代码,如清除加载中的元素、释放操作资源等。finally() 方法返回的是一个新的 Promise 对象,它的结果是执行完成后原 Promise 对象的结果。在实际应用中,我们可以结合 then()catch() 方法来处理最终的执行结果,实现更加精细的控制。

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


纠错反馈