如何循环异步/等待?

时间:2018-09-03 15:44:16

标签: javascript async-await ecmascript-5

我需要多次重复异步/等待块,但是不能使用以下代码:

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

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

2 个答案:

答案 0 :(得分:3)

如果迭代顺序无关紧要,请使用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的很多情况都是浪费的,因为每个迭代都不依赖于前一个迭代,但是每个迭代都在等待上一个迭代解决之前甚至尝试运行下一个迭代。

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

来自ESLint no-await-in-loop docs

  

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

答案 1 :(得分:0)

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

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

您可以尝试一下。希望它能工作。

相关问题