finally 是 Promise 实例的标准方法,用于状态确定后执行清理操作,不接收参数、不改变链式结果,类似 try...finally,常见于关闭加载、释放资源等场景。

finally 不是 Promise 的“方法”,而是 Promise 实例上的一个标准方法,用于在 Promise 状态最终确定(无论 fulfilled 还是 rejected)后执行清理操作,不接收任何参数,也不影响 Promise 的链式结果。
finally 的作用和特点
它类似同步代码中的 try...finally 块:不管 Promise 成功或失败,里面的回调都会执行。它不接收上一个 Promise 的值,也不改变后续 .then 或 .catch 接收的值。
常见用途包括:关闭加载状态、释放资源、清除定时器、重置 UI 等。
基本用法示例
以下是一个典型场景:发起请求时显示 loading,结束后统一隐藏:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
let loading = true;
fetch('/api/data')
.then(response => response.json())
.catch(error => console.error('请求失败:', error))
.finally(() => {
loading = false; // 无论成功失败都执行
});
注意 finally 不会“吞掉”错误
如果前面的 Promise 被 reject,且没有被 .catch 捕获,错误会继续向后传递——finally 不会阻止错误冒泡。
下面这段代码仍会抛出未捕获错误:
Promise.reject('出错了')
.finally(() => console.log('清理完成')); // ✅ 执行
// ❌ 但错误未被处理,控制台仍报错
正确做法是确保有 .catch(或在 .finally 后接 .catch):
- 在 finally 前加 .catch 处理错误
- 或把 .catch 放在 finally 之后,保证错误不丢失
finally 与 then/catch 的执行顺序
当 Promise 已 settled(已决议),finally 回调会立即入微任务队列;它总在当前 Promise 的 .then/.catch 回调之后、下一个 .then 的回调之前执行。
例如:
Promise.resolve(1)
.then(x => { console.log('then1:', x); return x + 1; })
.finally(() => console.log('finally'))
.then(x => console.log('then2:', x));
// 输出顺序:
// then1: 1
// finally
// then2: 2

















