繁体   English   中英

修复 no-await-in-loop lint 警告

[英]Fix no-await-in-loop lint warning

我需要多次重复 async/await 块,但不能使用以下代码:

for (let i = 0; i <= 10; i += 1) {
   const res = await DoSomething();
 }

因为它与 no-await-in-loop 规则相矛盾。

如果迭代顺序无关紧要,请使用Promise.all

如果您不介意代码乱序运行(意味着每次迭代的顺序无关紧要),只需使用Promise.all

const promises = [];

for (let i = 0; i <= 10; i += 1) {
  promises.push(DoSomething());
}
 
const responses = await Promise.all(promises);

来自MDN

Promise.all(iterable) 方法返回一个 Promise,当 iterable 参数中的所有承诺都已解决时,该 Promise 会解决

或禁用该块的规则

否则,如果您确实需要执行顺序工作,只需禁用该的规则

/* eslint-disable no-await-in-loop */
for (let i = 0; i <= 10; i += 1) {
  const res = await DoSomething();
}
/* eslint-enable no-await-in-loop */

循环中的await通常是非常低效的

规则存在是有原因的。 在循环中使用await很多情况都是浪费的,因为每次迭代都不依赖于前一次,但每次迭代甚至在尝试运行下一次之前都会等待前一次解决。

Promise.all在这些情况下效率更高,因为它或多或少地以“并行”方式工作。

来自ESLint no-await-in-loop 文档

对可迭代对象的每个元素执行操作是一项常见任务。 但是,在每个操作中执行 await 表明程序没有充分利用 async/await 的并行化优势。

ES 9 为异步迭代添加了一个新功能。

for await (const line of readLines(filePath)) {
   console.log(line);
}

你可以试试看。 希望它有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM