Spec-Zone.ru › ESLint

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 внутри циклов.

Примеры

Примеры корректного кода для этого правила:

Открыть в Playground
/*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));
}

Примеры некорректного кода для этого правила:

Открыть в Playground
/*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(await bar(thing));
  }
  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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API