Promise.finally() 无条件在 Promise 结束(fulfilled 或 rejected)后立即执行,不接收参数、不改变链式值,常用于加载状态关闭、资源释放等统一收尾操作。

Promise.finally() 会在 Promise 状态变为 fulfilled(成功)或 rejected(失败)后**无条件执行**,不关心最终结果,也不接收参数。它常用于清理操作,比如关闭加载状态、释放资源、重置 UI 等。
finally 的执行时机和特点
它不是“最后才执行”,而是“只要 Promise 结束就执行”——无论前面是 .then() 还是 .catch(),也无论链式调用多长,.finally() 总在当前 Promise 实例的状态确定后立即触发:
- 如果 Promise 成功,执行完
.then()回调后进入.finally() - 如果 Promise 失败,执行完
.catch()回调后进入.finally() - 即使
.then()或.catch()中抛出新错误,.finally()仍会执行(但后续的.catch()可能捕获该错误)
finally 不接收参数,也不影响链式值
.finally() 的回调函数没有参数,无法得知 Promise 是成功还是失败。更重要的是:它不能修改向下传递的值:
- 若返回一个普通值(如
return 'done'),该值会被忽略,原 Promise 的结果继续向后传递 - 若返回一个新的 Promise,
.finally()会等待它完成,但最终仍把原始 Promise 的结果(fulfilled 值或 rejection 原因)传给下一个.then()或.catch()
典型使用场景:统一收尾操作
最常见的是配合 loading 状态管理:
立即学习“Java免费学习笔记(深入)”;
let loading = true;
fetch('/api/data')
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('请求失败:', err))
.finally(() => {
loading = false; // 无论成功失败,都关闭 loading
});
其他适用情况包括:
- 关闭模态框、隐藏遮罩层
- 释放定时器(
clearTimeout)、取消事件监听 - 日志记录(“请求已完成”,不区分成败)
- 数据库连接池归还连接(需结合具体库的 cleanup 方法)
注意与 then/catch 的区别
.finally() 不是 .then(() => {...}) 的简写。后者只在成功时执行;而 .finally() 是对称覆盖两种终态。若想在 finally 中做分支逻辑(比如根据成败不同处理),应改用 .then(onFulfilled, onRejected) 或分别写 .then().catch().finally(),并在各自回调中处理。










