在日常业务里,经常有这种需求:
- 先做一件异步事(请求、弹窗、授权等);
- 不管结果成功还是失败,后续流程都要继续。
这段代码就是一个典型例子:
js
this.requestSomeSubscribeMessage().finally(() => {
this.getSomeData(item.status);
});
1. 这段代码到底是什么语法?
这是 Promise 链式调用:
this.requestSomeSubscribeMessage()返回一个 Promise;.finally(...)注册一个"收尾回调";- 当前面 Promise 结束(fulfilled 或 rejected)时,
finally里的代码都会执行。
一句话:finally = 不管成败都执行。
2. 和 then / catch 的区别
最核心区别:
then:只处理成功catch:只处理失败finally:成功失败都执行(常用于收尾)
示例:
js
doSomething()
.then((res) => {
console.log('成功', res);
})
.catch((err) => {
console.log('失败', err);
})
.finally(() => {
console.log('一定会执行');
});
3. 为什么订阅消息这个场景特别适合 finally?
你的业务要求是:
- 先调起订阅弹窗;
- 用户允许、拒绝、关闭、报错都不阻断;
- 始终继续办理保险流程。
这正是 finally 的语义:把"不应被阻断的后续逻辑"放进统一出口。
4. 你这段代码可以怎么理解(按执行顺序)
js
this.requestSomeSubscribeMessage().finally(() => {
this.getSomeData(item.Status);
});
执行过程:
- 调用
requestSomeSubscribeMessage(异步); - 等它结束;
- 不管结束状态是什么,都调用
getSomeData(...)。
5. 一个容易混淆的点:finally 不是拿结果用的
finally 适合做"收尾动作",比如:
- 关闭 loading
- 释放锁
- 继续不应中断的流程
- 埋点/日志(不依赖业务结果时)
如果你要依赖成功结果(如 res.data),应该在 then 里处理。
6. async/await 的等价写法(推荐复习)
你这段逻辑也可以写成:
js
try {
await this.requestSomeSubscribeMessage();
} finally {
this.getSomeData(item.tianCaiInsuranceStatus);
}
这和 Promise 的 finally 语义一致:
try 成功或抛错,finally 都执行。
7. 实战建议(可直接记忆)
-
看语义选方法:
- 只成功:
then - 只失败:
catch - 都要执行:
finally
- 只成功:
-
把"必须执行"的业务放 finally,最不容易漏逻辑。
-
不要在 finally 里写依赖成功结果的代码(会让代码可读性变差)。
8. 这个案例的一句话总结
this.requestSomeSubscribeMessage().finally(...) 的含义就是:
"订阅流程结束后(不论结果),都继续办理保险。"