检测 VSCode 中 JavaScript 方法中缺少的等待

问题描述 投票:0回答:4

我正在寻找一些 eslint 选项,或者其他一些方法来在调用类内的异步方法之前检测是否缺少“await”关键字。考虑以下代码:

const externalService = require('./external.service');

class TestClass {

constructor() { }

async method1() {
    if (!await externalService.someMethod()) {
        await this.method2();
    }
}

async method2() {
    await externalService.someOtherMethod();
}

module.exports = TestClass;

如果我将 method1 转换为:

将不会有警告
async method1() {
    if (!await externalService.someMethod()) {
        this.method2();
    }
}

我尝试对“.eslintrc”文件执行以下操作:

"require-await": 1,
"no-return-await": 1,

但运气不好。有人知道这是否可能吗? 非常感谢!

javascript node.js visual-studio-code eslint eslintrc
4个回答
15
投票

typescript-eslint对此有一个规则:

no-floating-promises

此规则禁止在语句中使用类似 Promise 的值,而不适当处理其错误...处理 Promise 值语句的有效方法包括

await
ing、返回以及使用两个参数调用
.then()
.catch()
有一个论点。

您可能从名称中了解到,typescript-eslint 旨在为 eslint 添加 TypeScript 支持,但您也可以将其与 JavaScript 一起使用。我想你可以决定这一规则是否太过分,但步骤如下:

  1. 生成

    tsconfig.json
    文件

    npx tsc --init
    
  2. 安装依赖项

    npm install --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
    
  3. 修改您的

    .eslintrc
    文件

    根据我的测试,您至少需要这些条目:

    {
      "parser": "@typescript-eslint/parser",
      "parserOptions": { "project": "./tsconfig.json" },
      "plugins": ["@typescript-eslint"],
      "rules": {
        "@typescript-eslint/no-floating-promises": ["error"]
      }
    }
    

如果您想在不使用

await
的情况下调用异步函数,您可以:

  • 使用规则

    文档中提到的
    void运算符,例如

    void someAsyncFunction();
    
    
  • 或者只需将上面

    error

     配置中的 
    warn
     更改为 
    .eslintrc
    
    

有关设置 typescript-eslint 的文档可在此处获取更多信息:

https://typescript-eslint.io/docs/linting/linting

下次运行 eslint 时,您应该会看到应用的规则:

$ npm run lint ... ./services/jobService.js 11:5 warning Promises must be awaited, end with a call to .catch, end with a call to .then with a rejection handler or be explicitly marked as ignored with the `void` operator @typescript-eslint/no-floating-promises
既然您特别提到了 VS Code,这也与 

ESLint 插件完美集成

vscode showing no-floating-promises rule


3
投票

require-await

 表示“不要创建函数 
async
,除非你在其中使用 
await
”。

这是因为

async

有两个作用:

    它强制函数返回一个承诺
  • 它可以让你在里面使用
  • await
    
    
前者很少有用,这意味着如果您没有在函数内使用

await

,您需要质疑为什么将其标记为 
async


no-return-await

 阻止你做:

return await something
因为 

await

 从 Promise 中解开一个值,但从 
async
 函数返回一个值将其包装在 Promise 中。

由于

just 返回一个承诺会导致该承诺被采用,因此将 return

await
 结合起来只是臃肿。


所以这些都没有达到你想要的效果。

这让我们了解您的实际愿望。

据我所知,ESLint 中不存在这样的功能,而且我认为拥有这样的功能也没什么用。

在很多用例中,您不想等待

async

 函数返回的内容。

例如

const array_of_promises = array_of_values.map( value => do_something_async(value) ); const array_of_resolved_values = await Promise.all(array_of_promises);
上面是一个常见的用例,您希望并行运行一堆异步函数,然后等待它们全部解析。

另一个例子是

no-return-await

旨在检测的情况!

此类情况很常见,大多数人都不希望他们的工具链要求他们这么做。


1
投票
有一个 ESLint 插件可以用来替代 typescript-eslint 路线:

https://github.com/SebastienGllmt/eslint-plugin-no-floating-promise


1
投票
考虑使用 eslint 规则的组合来获得更好的检查版本

await

:

无浮动承诺

return-await 带有 try-catch 选项,可以捕获 Promise 拒绝(参考

© www.soinside.com 2019 - 2024. All rights reserved.