Promise.prototype.finally 用于 Promise 状态最终确定后执行无参清理操作,不接收结果值、不等待异步返回、不影响链式传递的值,适用于关闭加载态、释放资源等场景。

Promise.prototype.finally 用于在 Promise 状态最终确定(无论 fulfilled 还是 rejected)后执行清理操作,不接收 Promise 的结果值,也不影响后续链式调用的值传递。
finally 的基本用法
它接受一个无参函数,在 Promise 结束后自动调用,适合关闭加载状态、释放资源、重置 UI 等不需要区分成功或失败的场景:
- 不会收到 resolve 值或 reject 原因,函数内无法直接访问结果
- 返回值会被忽略;若返回 Promise,不会等待其完成(与 then/catch 不同)
- 不影响链式调用中下一个 then 接收到的值
常见清理场景示例
比如显示 loading、请求后隐藏:
let loading = true;
fetch('/api/data')
.then(res => res.json())
.catch(err => console.error('请求失败:', err))
.finally(() => {
loading = false; // 无论成功失败都关闭 loading
});
再如打开弹窗后确保关闭:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
showModal(); apiCall() .then(data => process(data)) .catch(err => handleError(err)) .finally(() => closeModal()); // 弹窗一定关闭
注意 finally 不等待异步操作
如果在 finally 回调里发起异步任务(如 log 上报、延时清理),它不会阻塞 Promise 链:
Promise.resolve(42)
.finally(() => {
return new Promise(resolve => setTimeout(resolve, 1000)); // 被忽略,不等待
})
.then(val => console.log(val)); // 立即输出 42,不是 1 秒后
如需等待异步清理,应改用 then + catch 组合 或封装成新 Promise。
与 then/catch 的行为对比
以下三段逻辑效果不同:
-
.then(f, f):f 会收到参数(成功值或错误),且可能被多次写错(容易漏写第二个参数) -
.then(f).catch(f):catch 中的 f 仅在 rejected 时执行,无法覆盖所有结束情况 -
.finally(f):f 无参、必执行、不干扰数据流,语义最清晰
推荐优先使用 finally 处理纯清理逻辑,保持代码意图明确。

















