我需要多次重复 async/await 块,但不能使用以下代码:
for (let i = 0; i <= 10; i += 1) {
const res = await DoSomething();
}
因为它与无等待循环规则相矛盾。
如果迭代顺序无关紧要,请使用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(可迭代(方法返回单个 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 无等待在循环文档中:
对可迭代对象的每个元素执行操作是一项常见任务。但是,在每个操作中执行 await 表示程序没有充分利用 async/await 的并行化优势。
ES 9 为异步迭代添加了新功能。
for await (const line of readLines(filePath)) {
console.log(line);
}
你可以试试。希望它有效。