![](/img/trans.png)
[英]Elegant solution - Nested for loops (eslint no-await-in-loop)
[英]Why ESLint no-await-in-loop not working with for await of?
for await of
— 应该与异步迭代器一起使用,它等待迭代器中的每个 promise 并处理其主体中每个等待的 promise 的响应。 在 MDN 文档中,此语法也可用于同步迭代器,因此
我有以下类似的代码示例:
(async () => {
const entityIds = [1, 2, 3, 4];
for await (const id of entityIds) {
console.log(await getEntityById(id));
}
})();
和:
(async () => {
const entityIds = [1, 2, 3, 4];
for (const id of entityIds) {
console.log(await getEntityById(id)); // ESLint: Unexpected `await` inside a loop.(no-await-in-loop)
}
})();
但是在第二个示例中,我收到了关于规则no-await-in-loop
eslint
警告。 问题是:为什么? 这 2 个循环的每次迭代都将等待异步 function 完成,但eslint
根本不会对第一种情况做出反应。
ESLint 中的 no-await-in-loop 规则应该可以防止您意外地顺序处理某些数据。 原因是通常在循环中await
并不是故意的,因为并行处理数据效率更高。 因此,当规则打开时,循环中所有await
的使用都被认为是“错误”。
使用for await...of
被规则明确认为是“有意的”。 检查规则的测试(文档页面底部),以下部分被列为有效代码:
valid: [
// ...
// Asynchronous iteration intentionally
"async function foo() { for await (var x of xs) { await f(x) } }"
],
而在任何其他循环结构中使用await
都是无效的。 包括在for await...of
的循环内使用await
:
invalid: [
// ...
// In a nested loop of for-await-of
{ code: "async function foo() { for await (var x of xs) { while (1) await f(x) } }", errors: [error] }
]
最有可能的原因是使用for await...of
你选择进入顺序处理。 如果您处理一个异步可迭代对象,那么您无法并行执行该操作的可能性非常高,如果您尝试这样做将会出错。 如果您正在处理一个产生承诺的同步迭代,您仍然有可能无法正确地并行执行此操作。
ESLint 实际上无法检测您是否有一个同步迭代器,它会像数组迭代器一样产生同步结果,因此,它假定它是前两个选项之一。
在我看来,这条规则是有缺陷的,因为它是全有或全无。 启用它意味着您不希望其中有await
循环。 在某些有效情况下,您希望在内部使用for...of
和await
进行顺序处理。 这意味着您的代码很可能会在您不需要时临时禁用该规则。
我的建议是禁用 no-await-in-loop 规则,并在使用顺序处理和使用并行处理时运用常识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.