finally 确保代码无论 promise 成功或失败都执行,适合清理逻辑;不接收参数、不影响值传递,返回值通常被忽略,常与 then/catch 或 try/catch/finally 混用。

finally 用于在 Promise 链或 try/catch 中,确保一段代码无论如何都会执行,适合放清理逻辑,比如关闭加载状态、释放资源、重置变量等。
在 Promise 链中用 finally
Promise 的 finally() 方法不接收参数,也不影响前面的值传递。它会在 Promise 变为 fulfilled 或 rejected 后立即执行,且不关心结果是成功还是失败。
常见写法:
- 放在 .then() 和 .catch() 之后(顺序不影响)
- 即使前面没写 .catch(),finally 依然会执行
- 不能直接从 finally 捕获错误,但它本身抛错会中断后续链(一般避免在 finally 里 throw)
showLoading();<br>fetch('/api/data')<br> .then(res => res.json())<br> .then(data => console.log(data))<br> .catch(err => console.error('请求失败:', err))<br> .finally(() => hideLoading()); // 无论成功失败都执行
在 async/await 中配合 try/catch 使用 finally
async 函数内部可使用 try...catch...finally 语句块,语义更清晰,也更接近同步代码习惯。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
finally 块中的代码在 try 结束或 catch 执行完后一定会运行。
示例:打开连接 → 操作 → 关闭连接async function fetchData() {<br> const conn = openConnection();<br> try {<br> const data = await fetch('/api/data').then(r => r.json());<br> return data;<br> } catch (err) {<br> console.error('处理出错', err);<br> throw err;<br> } finally {<br> conn.close(); // 确保关闭,哪怕上面 throw 了也执行<br> }<br>}
注意点:finally 不改变 Promise 状态
finally 返回的值会被忽略(除非返回一个 pending Promise,此时会等待它完成)。
- 如果 finally 返回普通值(如
return 123),不会改变原 Promise 的结果 - 如果 finally 返回一个 Promise,整个链会等待它 resolve,但最终值仍是原 Promise 的结果(除非前面被 catch 改写)
- 不建议在 finally 中做异步操作并期望它影响流程,容易引发误解
和 try/catch/finally 的区别与联系
同步代码里的 try/catch/finally 和 Promise 的 .finally() 行为一致:都保证 finally 部分一定执行。区别只在于适用场景——前者用于同步异常,后者用于 Promise 异步流程。
两者可以混用,比如在 async 函数里用 try/catch 处理 await 错误,再用 finally 清理;也可以在外层 Promise 链用 .finally() 统一收尾。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










