在JS中,假设我以一种"触发后忘记"的方式调用一个promise。我不关心它是否成功,也不关心它返回什么,因为我无论如何都想返回相同的值。
我可以调用
return myPromise().then(() => foo).catch(() => foo);
是否有办法不重复then
和catch
部分?
我已经试过了
我想使用finally
,认为它将采取什么最终返回(类似于Java通过采取最后块的返回值):return myPromise().finally(() => foo);
但结果并没有达到我的预期。根据mdn,如果原始承诺被拒绝,此返回值将用于拒绝。
您可以声明您的结果返回函数一次,然后为.then()
和.catch()
处理程序重复使用它两次
const myReturn = () => foo;
return myPromise()
.then(myReturn)
.catch(myReturn);
您可以通过使用同时处理成功和失败路径的.then()
的两个参数来进一步缩短此长度:
const myReturn = () => foo;
return myPromise()
.then(myReturn, myReturn);
如果你发现经常需要这个,你可以创建一个小的库函数,它接受一个值并返回两个函数,它们都只对它求值:
const doubleThunk = val =>
[() => val, () => val];
可以这样使用:
return myPromise()
.then(...doubleThunk(foo));
来自@ decize的评论和@Bergi的澄清:
myPromise()
.catch(() => {}) // ignore any error
.then(() => foo) // always return foo
如果你的目标是较新的浏览器或Node.js版本,你可以看看Promise.allSettled
。
此函数将返回一个Promise,该Promise将解析传递的Promise是否被解析或拒绝。
function foo(results) {
console.log('foo():', ...results)
}
// Success path
Promise.allSettled([Promise.resolve('Yay')]).then(foo)
// Failure path
Promise.allSettled([Promise.reject('Doh')]).then(foo)
.as-console-wrapper { max-height: 100% !important; }