finally是Promise链中唯一能保证无论fulfilled或rejected都执行的清理方法,不接收参数、不改变原值、避免then/catch重复编码,天然适合关闭loading等收尾操作。

在 Promise 链中,finally 是最简洁、最可靠的方式,在请求无论成功或失败后统一关闭加载状态(比如隐藏 loading 指示器、禁用按钮等),避免遗漏。
为什么用 finally 而不是 then/catch?
finally 保证在 Promise 状态变为 fulfilled 或 rejected 后都会执行,且不接收 Promise 的结果值或错误,天然适合做“收尾清理”。相比在 then 和 catch 中重复写关闭逻辑,finally 更安全、更少出错。
基本用法:配合 setState 或 DOM 操作
假设你用 React 管理加载状态:
const [loading, setLoading] = useState(false);
const fetchData = async () => {
setLoading(true);
try {
const res = await fetch('/api/data');
const data = await res.json();
setData(data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false); // ✅ 无论成功失败都执行
}
};
或者用原生 Promise + finally(兼容性好,现代浏览器和 Node.js 均支持):
立即学习“Java免费学习笔记(深入)”;
setLoading(true);
fetch('/api/data')
.then(res => res.json())
.then(data => setData(data))
.catch(err => setError(err.message))
.finally(() => setLoading(false)); // ✅ 清理加载态
注意点:finally 不会中断链,也不改变值
-
finally返回的 Promise 会等待其回调执行完,再把前面的结果(或错误)往下传 —— 所以它不影响后续then或catch的行为。 - 不要在
finally里return值或抛错(除非有意中断),否则可能意外覆盖原始结果。 - 如果需要在 finally 中异步清理(如调用一个返回 Promise 的日志上报),建议用
await并确保不 throw,或用.catch(() => {})吞掉内部错误,防止影响主流程。
实际场景小技巧
- 多个并行请求?可封装成 Promise.all([...]).finally(...),统一控制总加载态。
- 按钮点击防重复提交?在点击时设 loading = true,Promise finally 设回 false,同时禁用按钮(用
disabled={loading})。 - 全局 loading?可在请求拦截器/响应拦截器中统一注入
finally逻辑(如 Axios 的interceptors.response.use(..., ..., config => {...}))。


















