版本

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 的语义缺乏理解而可能造成的常见性能危害。

此规则的 错误 代码示例

在 Playground 中打开
/*eslint no-return-await: "error"*/

async function foo() {
    return await bar();
}

此规则的 正确 代码示例

在 Playground 中打开
/*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 中引入。

延伸阅读

资源

更改语言