try/catch 中的return wait

2024-01-29 23:49:06 浏览数 (1)

标题可能听起来有些奇怪,看到标题是可能我们脑海中首先想到的是:“Eslint 告诉我要去掉 await,在 return 后面不需要 await”。

但我们的情况与之不同,当我们将我们的 promise 包装在 try/catch 中时。

代码语言:javascript复制
async function foo() {
  try {
    return await waitAndMaybeReject();
  } catch (e) {
    return 'caught';
  }
}

这也适用于当我们不需要返回 promise 的已解决值时。如果返回的 promise 在 try/catch 中,我们总是需要 await,来捕获错误的。

通过返回一个 promise,我们推迟了它的结果,因此我们的 catch 块永远不会执行。这也会发生在不等待 promise(无论是否返回)时。

只有在 try/catch 块之外,return await 才是多余的。甚至有一个 Eslint 规则,但该规则是允许在 try/catch 中使用 return。

如果我们想在 return 语句之后打印一些内容,而不是临时创建一个变量、打印然后返回,像下面这样:

代码语言:javascript复制
async function foo() {
  const res = await fetch();
  console.log('after fetch')
  return res;
} 

我们可以使用 try 和 finally 包裹 return(当然,除非我们需要打印 promise 的已解决值),像下面这样:

代码语言:javascript复制
async function foo() {
  try {
    return await fetch();
  } finally {
    console.log('after fetch')
  }
} 

我正在参与2023腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞