我正在寻找一些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;
如果我将method 1转换为以下内容,则不会出现警告:
async method1() {
if (!await externalService.someMethod()) {
this.method2();
}
}
我尝试对.“eslintrc”文件执行以下操作:
"require-await": 1,
"no-return-await": 1,
但是没有运气。有人知道这是否可能吗?非常感谢!
3条答案
按热度按时间v1l68za41#
typescript-eslint对此有一条规则:
no-floating-promises
此规则禁止在未适当处理错误的情况下在语句中使用类似Promise-like的值...处理Promise-valued语句的有效方法包括
await
ing、return以及使用两个参数调用.then()
或使用一个参数调用.catch()
。从名称中您可能已经知道,typescript-eslint旨在为eslint添加TypeScript支持,但您也可以将其用于JavaScript。我想这取决于您是否对这一规则过度使用,但以下是步骤:
1.生成
tsconfig.json
文件1.安装依赖项
1.修改
.eslintrc
文件根据我的测试,看起来您至少需要以下条目:
如果您希望在某些地方调用异步函数而不使用
await
,您可以:void
运算符,例如.eslintrc
配置中的error
更改为warn
有关设置typescript-eslint的文档,请访问以下位置以获取更多信息:https://typescript-eslint.io/docs/linting/linting
下一次运行eslint时,应该会看到应用的规则:
由于您特别提到了VS Code,因此它还可以与ESLint plugin完美集成:
w8biq8rn2#
require-await
表示“除非在函数async
中使用了await
,否则不要创建函数async
”。这是因为
async
具有两个效果:await
前者很少有用,这意味着如果你没有在函数内部使用
await
,你需要问为什么你把它标记为async
。no-return-await
阻止您执行以下操作:因为
await
从promise中打开一个值,但是从async
函数返回一个值时却将其 Package 在promise中。由于 * 仅仅 * 返回一个承诺就会导致该承诺被采纳,因此将
return
与await
结合起来只是膨胀。所以这两个都不是你想要的。
这就引出了你真正的愿望。
(据我所知)ESLint中不存在这样的特性,而且我认为拥有这样的特性也没有什么用处。
在许多用例中,您不希望等待
async
函数返回的内容。例如:
上面是一个常见的用例,您希望并行运行一组异步函数,然后等待它们全部解析。
另一个例子是
no-return-await
设计用于检测的情况!像这样的情况很常见,大多数人都不希望他们的工具链叫他们这样做。
vxqlmq5t3#
有一个ESLint插件可用于此,您可以将其用作typescript-eslint路径的替代方法:
https://github.com/SebastienGllmt/eslint-plugin-no-floating-promise