Promise.prototype.finally 会在 Promise 状态确定后无条件执行,用于清理逻辑,不接收值或错误、不影响链式结果,且应置于链末尾以确保所有分支执行完毕后再清理。

Promise.prototype.finally 会在 Promise 状态确定(即变为 fulfilled 或 rejected)后无条件执行,适合放清理逻辑,比如关闭加载提示、释放资源、重置状态等。
finally 的核心特点
它不接收 Promise 的最终值或错误原因,也不影响链式结果——返回的 Promise 会延续上游的状态和值:
- 上游成功 →
finally执行完后仍返回成功,值不变 - 上游失败 →
finally执行完后仍返回失败,错误不变 - 无法在
finally里“捕获”或“改变”错误(想处理错误得用catch)
典型清理场景示例
比如发起请求时显示 loading,无论成功失败都要隐藏:
```jslet isLoading = true;
fetch('/api/data')
.then(res => res.json())
.then(data => console.log('成功:', data))
.catch(err => console.error('失败:', err))
.finally(() => {
isLoading = false; // 清理:关闭 loading
console.log('请求结束,已清理');
});
```
和 then/catch 的关键区别
下面两种写法效果不同:
立即学习“Java免费学习笔记(深入)”;
-
.then(...).catch(...).finally(...)→finally在整个链结束后执行(推荐) -
.then(..., ...).finally(...)→finally在该then的回调执行后就执行(可能早于后续链)
多数情况下应把 finally 放在整个 Promise 链末尾,确保所有异步分支都走完再清理。
注意点
-
finally回调不能阻止 Promise 状态传播,也不能修改返回值 - 如果
finally中抛出错误,会覆盖上游的错误(变成新错误),一般应避免在其中 throw - 不支持传参,所以需通过闭包或外部变量访问上下文(如上面的
isLoading)


















