标题可能听起来有些奇怪,看到标题是可能我们脑海中首先想到的是:“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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!