no-return-await
禁止不必要的 return await
💡 hasSuggestions
此规则报告的一些问题可以通过编辑器 建议 手动修复。
此规则在 ESLint v8.46.0 中已 **弃用**,且没有替代方案。此规则的最初目的是避免使用 return await
,以避免额外的微任务。但是,由于 JavaScript 现在以不同的方式处理原生 Promise
,因此不再存在额外的微任务。更多技术信息可以在 此 V8 博客文章 中找到。
在 async function
内部使用 return await
会使当前函数保留在调用栈中,直到正在等待的 Promise 已完成,代价是在完成外部 Promise 之前会多出一个微任务。return await
也可以在 try/catch 语句中使用,以捕获返回 Promise 的另一个函数的错误。
您可以通过不等待返回值来避免额外的微任务,但代价是如果从返回的 Promise 中异步抛出错误,则该函数不再是堆栈跟踪的一部分。这可能会使调试变得更加困难。
规则详情
此规则旨在防止由于缺乏对 async function
语义的理解而可能导致的常见性能问题。
此规则的 **错误** 代码示例
在游乐场中打开
/*eslint no-return-await: "error"*/
async function foo() {
return ;
}
此规则的 **正确** 代码示例
在游乐场中打开
/*eslint no-return-await: "error"*/
async function foo1() {
return bar();
}
async function foo2() {
await bar();
return;
}
// This is essentially the same as `return await bar();`, but the rule checks only `await` in `return` statements
async function foo3() {
const x = await bar();
return x;
}
// In this example the `await` is necessary to be able to catch errors thrown from `bar()`
async function foo4() {
try {
return await bar();
} catch (error) {}
}
何时不使用它
您可能希望关闭此规则的一些原因
- 如果您想使用
await
来表示 thenable 值 - 如果您不希望避免
return await
带来的性能优势 - 如果您希望函数显示在堆栈跟踪中(对调试很有用)
版本
此规则是在 ESLint v3.10.0 中引入的。