Eslint参考手册
规则 | Rules
no-await-in-loop
对迭代器的每个元素执行操作是一项常见任务。然而,执行await
每个操作的一部分是一个表示该程序未服用的并行化的好处充分利用async
/await
。
通常,应该重构代码以一次创建所有的承诺,然后使用访问结果Promise.all()
。否则,每个连续的操作都不会开始,直到前一个操作完成。
具体来说,下面的函数应该重构如下所示:
async function foo(things) {
const results = [];
for (const thing of things) {
// Bad: each loop iteration is delayed until the entire asynchronous operation completes
results.push(await bar(thing));
}
return baz(results);
}
async function foo(things) {
const results = [];
for (const thing of things) {
// Good: all asynchronous operations are immediately started.
results.push(bar(thing));
}
// Now that all the asynchronous operations are running, here we wait until they all complete.
return baz(await Promise.all(results));
}
规则细节
此规则不允许await
在循环体内使用。
示例
此规则的正确代码示例:
async function foo(things) {
const results = [];
for (const thing of things) {
// Good: all asynchronous operations are immediately started.
results.push(bar(thing));
}
// Now that all the asynchronous operations are running, here we wait until they all complete.
return baz(await Promise.all(results));
}
此规则的错误代码示例:
async function foo(things) {
const results = [];
for (const thing of things) {
// Bad: each loop iteration is delayed until the entire asynchronous operation completes
results.push(await bar(thing));
}
return baz(results);
}
何时不使用它
在许多情况下,循环的迭代实际上并不相互独立。例如,一次迭代的输出可能被用作另一次的输入。或者,可能会使用循环来重试不成功的异步操作。在这种情况下,await
在循环中使用它是有意义的,建议通过标准ESLint禁用注释来禁用规则。
版本
该规则在ESLint 3.12.0中引入。
资源
- 规则来源
- 文档来源
规则 | Rules相关
ESLint 是一个代码规范和错误检查工具,有以下几个特性。所有东西都是可以插拔的。你可以调用任意的 rule api 或者 formatter api 去打包或者定义 rule or formatter。任意的 rule 都是独立的。没有特定的 coding style,你可以自己配置。
主页 | https://eslint.org/ |
源码 | https://github.com/eslint/eslint |
发布版本 | 4.12.0 |