finally 用于确保 promise 无论 fulfilled 或 rejected 都执行清理操作,不接收参数、不影响链式结果,返回与原 promise 相同状态的新 promise,适用于关闭加载动画、释放资源等副作用,但不能替代 catch 处理错误。

finally 用于确保一段代码无论 Promise 是 fulfilled 还是 rejected 都会执行,常用来清理资源、重置状态或记录日志。
finally 的基本用法
它不接收参数,也不影响 Promise 的链式结果——既不会改变上一个 Promise 的值,也不会捕获错误。它只是“不管怎样都运行”:
- 如果前面是
.then()或.catch(),.finally()会在它们之后执行 - 即使前面的 Promise 被 reject 且没被
.catch()捕获,.finally()仍会执行(但错误会继续向上抛) - 它返回一个新的 Promise,其最终状态与前一个 Promise 相同(fulfilled 或 rejected)
常见适用场景
适合做副作用操作,比如关闭加载动画、释放锁、清空临时变量:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 发起请求后显示 loading,用
finally统一关闭,避免在then和catch里重复写 - 打开文件或连接后,用
finally确保调用close()或abort() - 调试时记录操作完成时间,不管成功失败都打点
注意和陷阱
finally 不是万能的错误兜底,不能替代 catch:
- 它内部抛出的错误会变成 rejected Promise,可能被后续
catch捕获 - 它无法访问 Promise 的返回值或错误对象(没有参数),如需处理结果请用
then或catch - 不要在
finally中 return Promise,否则会覆盖原 Promise 的结果(除非你明确想改变链的行为)
对比 try/catch/finally
async/await 中的 try...catch...finally 语义更接近同步逻辑:
-
finally块一定执行,哪怕try或catch中有return或抛错 - 可用于包裹异步操作,配合
await使用,逻辑更直观 - 若
finally内部抛错,会覆盖try或catch中的返回值或错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










