promise.finally()是es2018引入的方法,用于无论promise成功或失败都执行指定回调,常用于清理操作;它不接收参数、不改变原promise结果,仅在状态确定后执行一次。

Promise.finally() 是 Promise 的一个内置方法,专门用于在 Promise 状态最终确定(即变为 fulfilled 或 rejected)后,**无论成功还是失败都执行一次指定的回调函数**。它不接收 Promise 的结果值或错误原因,只表示“操作结束了”。
finally 的基本用法
它接收一个函数作为参数,该函数会在 Promise 完成后自动调用,且不会影响 Promise 的链式结果:
- 如果前面是
resolve,后续then仍能拿到原值; - 如果前面是
reject,后续catch仍能捕获原错误; -
finally中抛出的错误会被忽略(除非你显式处理),不影响下游流程。
示例:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
fetch('/api/data')
.then(res => res.json())
.then(data => console.log('成功:', data))
.catch(err => console.error('失败:', err))
.finally(() => {
console.log('请求已完成(不管成功或失败)');
// 常用于关闭 loading、释放资源等
});
finally 与 then/catch 的区别
finally 不是 then(null, fn) 的简写,关键差异在于:
-
then(null, fn)只在 rejected 时执行,且会吞掉错误(若 fn 不 re-throw); -
finally(fn)在 fulfilled 和 rejected 时都执行,且不干扰 Promise 的状态和值; -
finally回调无参数,无法直接访问结果或错误。
常见使用场景
适合做“清理类”或“副作用”操作,比如:
- 隐藏加载动画(
loading = false); - 关闭模态框或弹窗;
- 重置表单提交状态;
- 释放定时器、取消监听器(需配合 AbortController 等);
- 日志记录“操作结束”事件(非结果详情)。










