Javascript在then和catch中返回相同的值



在JS中,假设我以一种"触发后忘记"的方式调用一个promise。我不关心它是否成功,也不关心它返回什么,因为我无论如何都想返回相同的值。

我可以调用

return myPromise().then(() => foo).catch(() => foo);

是否有办法不重复thencatch部分?

我已经试过了

我想使用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; }

相关内容

  • 没有找到相关文章

最新更新