Promise.prototype.finally() 详解

在 JavaScript 中,Promise 是一种用于异步编程的重要工具。Promise对象可以降低异步代码的复杂度,并使其更加可读、可维护和可测试。Promise.prototype.finally() 方法是 ES2018 新增的一个特性,它为 JavaScript 开发者提供了一种在 Promise 链中无论成功或失败都会被调用的 finally 方法。

finally 方法的语法

Promise.prototype.finally() 方法的语法如下:

promise.finally(onFinally);

promise 是要添加 finally 方法的 Promise 对象,而 onFinally 则是一个将在 Promise 结束时被调用的回调函数。该方法将返回一个新的 Promise 对象,它将在 onFinally 执行后采用原先 Promise 的状态并传递相应的值。

finally 方法的作用

Promise.prototype.finally() 方法用于在 Promise 链中的最后一个方法中添加一个回调函数。无论 Promise 链是否被 resolved,finally 方法中的回调函数都会被执行。这提供了一种在最终处理 Promise 时调用回调函数的简便方法。

下面是一些 finally 方法的应用场景:

  • 处理资源管理,例如关闭文件或数据库连接
  • 规范化 Promise 链式流程的控制流
  • 处理日志记录、错误报告或运行时分析

finally 方法的示例代码

下面是一个使用 finally 方法的简单示例,我们将创建一个 Promise 对象并在其中添加一些异步操作。当 Promise 完成时,我们将使用 finally 方法来记录 Promise 结果的状态,并在控制台上输出一条日志:

const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('Promise resolved');
    }, 2000);
});

promise.then(result => {
    console.log(result);
}).catch(error => {
    console.error(error);
}).finally(() => {
    console.log('Promise ended');
});

在上面的示例中,我们创建了一个 Promise 对象并将其命名为 promise。在 Promise 中,我们使用了 setTimeout() 方法来模拟一个异步操作,并在两秒钟后将 Promise 对象的状态设置为 resolved。

接下来,我们向 Promise 链添加了三个方法:

  • then() 方法用于处理 resolve,它在 Promise 成功时将 Promise resolved 字符串记录到控制台。
  • catch() 方法用于处理 reject,它在 Promise 失败时将错误对象记录到控制台。
  • finally() 方法用于在 Promise 结束时记录 Promise ended 字符串。

当我们运行以上代码时,输出将如下所示:

总结

Promise.prototype.finally() 方法是 ES2018 中非常有用的一个特性,它为 JavaScript 开发者提供了一种在 Promise 链中执行必要的清理或记录任务的方法。该方法很容易使用,并且可以帮助开发人员更好地处理异步代码中的复杂性。

在使用 finally 方法时,请记得它将在原始 Promise 明确解决之后立即运行无论它的解决方案是 resolve 还是 reject。因此,在决定使用 finally 方法时,请确保你真正需要在此时执行某个操作,并且在确认原始 Promise 对象最终状态之前不必再执行操作。

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