【问题标题】:Fix no-await-in-loop lint warning修复 no-await-in-loop lint 警告
【发布时间】:2019-02-08 16:38:22
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript async-await eslint


【解决方案1】:

如果迭代顺序无关紧要,请使用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 都已解析时,该 Promise 将解析

或禁用该块的规则

否则,如果您确实需要为该块执行顺序工作,只需 disable the rule

/* 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 docs

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

【讨论】:

  • 是的,但这个问题在 SEO 上排名更高
【解决方案2】:

ES 9 增加了异步迭代的新特性。

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

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

【讨论】:

  • 值得注意的是 for await...of 只有在 readLines 是异步生成器时才需要。当需要等待语句块中的某些内容时,一个简单的for...of 就可以正常工作。
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 2016-07-07
  • 2022-01-02
  • 2012-12-11
  • 2021-07-07
  • 2014-08-23
  • 2010-11-11
  • 2021-07-05
相关资源
最近更新 更多