JS中Promise无论成败返回同一值如何避免重复写then/catch
简洁实现方案
你可以用「先吞掉所有错误,再统一返回固定值」的链式写法,不需要重复编写相同的返回逻辑:
return myPromise().catch(() => {}).then(() => foo);
执行逻辑:
- 不管
myPromise()是成功兑现还是失败拒绝,都会先经过catch回调:失败场景下错误会被直接捕获吞掉,返回一个成功状态的空值Promise;成功场景下会直接跳过catch向后传递 - 后续的
then逻辑一定会执行,固定返回foo,完全满足无论调用成功失败都返回同一个固定值的需求。
如果不想用空的catch占位,也可以把返回固定值的逻辑抽成可复用的回调,搭配then的双参数写法实现,同样没有重复代码:
const returnFoo = () => foo; return myPromise().then(returnFoo, returnFoo);
这个写法和你最初写的then().catch()行为完全等价:then的第二个参数作用就是捕获当前位置之前的Promise错误,和单独调用catch的效果没有区别。
为什么finally不符合预期
finally的设计定位是做收尾清理操作(比如关闭加载态、清理定时器、释放连接),本身就不会修改Promise链的原有状态和结果:
- 原Promise为成功状态时,
finally的返回值不会替换原有成功结果,除非finally内部主动抛出错误、或者返回一个失败状态的Promise - 原Promise为失败状态时,哪怕
finally里写了返回固定值,最终Promise链还是会抛出原有的拒绝原因,这和MDN文档描述的规则完全一致。JS的Promise.finally和Java中finally块的返回逻辑本来就不相同,不要混淆两种语言的特性。
补充:如果是完全不需要等待结果、也不需要固定返回值的纯「发后即忘」场景,直接写
void myPromise().catch(() => {})就够了,记得一定要加catch兜底,不然未捕获的Promise错误会抛到全局触发报错。
内容的提问来源于stack exchange,提问作者Ricola
相关产品推荐
相关产品推荐

