我正在寻找一些 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,
但运气不好。有人知道这是否可能吗? 非常感谢!
typescript-eslint对此有一个规则:
no-floating-promises
此规则禁止在语句中使用类似 Promise 的值,而不适当处理其错误...处理 Promise 值语句的有效方法包括
ing、返回以及使用两个参数调用await
或.then()
有一个论点。.catch()
您可能从名称中了解到,typescript-eslint 旨在为 eslint 添加 TypeScript 支持,但您也可以将其与 JavaScript 一起使用。我想你可以决定这一规则是否太过分,但步骤如下:
生成
tsconfig.json
文件
npx tsc --init
安装依赖项
npm install --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
修改您的
.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
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 插件完美集成:
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
旨在检测的情况!此类情况很常见,大多数人都不希望他们的工具链要求他们这么做。