修复了无等待循环 lint 警告



我需要多次重复 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);
}

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

最新更新