如何循环异步/等待?

Ale*_*lex 2 javascript ecmascript-5 async-await

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

for (let i = 0; i <= 10; i += 1) {
   const res = await DoSomething();
 }
Run Code Online (Sandbox Code Playgroud)

因为它与不等待循环规则相矛盾。

小智 7

ES 9 添加了异步迭代的新功能。

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

Run Code Online (Sandbox Code Playgroud)

你可以尝试一下。希望它有效。

  • 值得注意的是,只有当“readLines”是异步生成器时,才需要“forawait...of”。当需要等待语句块中的某些内容时,简单的“for...of”可以正常工作。 (5认同)

Nik*_*des 5

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

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

const promises = [];

for (let i = 0; i <= 10; i += 1) {
  promises.push(DoSomething());
}

const responses = await Promise.all(promises);
Run Code Online (Sandbox Code Playgroud)

MDN

Promise.all(iterable)方法返回一个Promise,当可迭代参数中的所有promise已解决时,该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 */
Run Code Online (Sandbox Code Playgroud)

但请记住

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

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

ESLint no-await-in-loop文档中

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

  • 是的,但是这个问题在SEO上排名更高 (2认同)