finally是promise的es2018标准方法,用于注册无论成功或失败都必定执行的清理回调;它不接收结果值,保持原promise终态,返回新promise以支持链式调用。

finally 是 Promise 的一个方法,用于注册无论 Promise 成功还是失败都**一定会执行**的回调函数,适合做清理工作(比如关闭加载状态、释放资源、重置 UI)。
finally 的基本用法
它不接收 Promise 的结果(既拿不到 resolve 的值,也拿不到 reject 的错误),只表示“任务结束了”。语法简洁:
它会返回一个新的 Promise,保持原 Promise 的终态(成功或失败),因此可以链式调用其他 then 或 catch。
和 then/catch 的关键区别
-
then(onFulfilled)只在成功时执行,catch(onRejected)只在失败时执行; -
finally(callback)在两种情况下都执行,且 不改变 Promise 的终态和值; - 如果
finally回调里抛出错误,新 Promise 会以该错误拒绝(但通常应避免在 finally 中 throw); - 如果
finally返回一个 Promise,新 Promise 会等待它完成后再延续原终态(较罕见,一般不用)。
典型使用场景示例
最常见的用途是统一收尾:比如请求前后控制 loading 状态:
fetch('/api/data')
.then(res => res.json())
.catch(err => console.error('请求失败:', err))
.finally(() => {
loading = false;
console.log('请求已结束,loading 已关闭');
});
注意:finally 放在 catch 后面更稳妥,确保即使没写 catch,也能执行清理逻辑。也可直接接在 then 后,因为无论前面是否被 catch,finally 都会触发。
兼容性与替代方案
现代浏览器和 Node.js(v10+)均原生支持 finally。若需兼容老环境(如 IE),可用 polyfill 或手动模拟:
return this.then(
value => Promise.resolve(callback()).then(() => value),
reason => Promise.resolve(callback()).then(() => { throw reason; })
);
};
不过实际项目中,只要目标环境明确支持,直接用原生 finally 即可,清晰又可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











