no-await-in-loop
Запретить await внутри циклов
Выполнение операции над каждым элементом итерируемого объекта — распространённая задача. Однако, выполнение await как части каждой операции указывает на то, что программа не полностью использует преимущества паралелизации, предоставляемые async/await.
Обычно код следует переработать, чтобы создать все промисы сразу, а затем получить доступ к результатам с использованием Promise.all(). В противном случае каждая последующая операция не начнётся, пока не завершится предыдущая.
Конкретно, следующую функцию следует переработать, как показано:
async function foo(things) {
const results = [];
for (const thing of things) {
// Bad: each loop iteration is delayed until the entire asynchronous operation completes
results.push(await bar(thing));
}
return baz(results);
}
async function foo(things) {
const results = [];
for (const thing of things) {
// Good: all asynchronous operations are immediately started.
results.push(bar(thing));
}
// Now that all the asynchronous operations are running, here we wait until they all complete.
return baz(await Promise.all(results));
}
Подробное описание правила
Это правило запрещает использование await внутри циклов.
Примеры
Примеры корректного кода для этого правила:
/*eslint no-await-in-loop: "error"*/
async function foo(things) {
const results = [];
for (const thing of things) {
// Good: all asynchronous operations are immediately started.
results.push(bar(thing));
}
// Now that all the asynchronous operations are running, here we wait until they all complete.
return baz(await Promise.all(results));
}
Примеры некорректного кода для этого правила:
/*eslint no-await-in-loop: "error"*/
async function foo(things) {
const results = [];
for (const thing of things) {
// Bad: each loop iteration is delayed until the entire asynchronous operation completes
results.push();
}
return baz(results);
}
Когда не следует использовать это правило
Во многих случаях итерации цикла не являются независимыми друг от друга. Например, результат одной итерации может использоваться в качестве входных данных для другой. Или циклы могут использоваться для повторных попыток асинхронных операций, которые завершились неудачей. Или циклы могут использоваться для предотвращения отправки чрезмерного количества запросов параллельно. В таких случаях использование await внутри цикла имеет смысл, и рекомендуется отключить правило с помощью стандартного комментария отключения ESLint.
Версия
Это правило было введено в ESLint v3.12.0.
Ссылки
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-await-in-loop