Как правильно сделать асинхронный генератор с неявным кол-вом выполнения?

Для создания асинхронного генератора с неявным количеством выполнения в JavaScript можно использовать функцию-генератор с ключевым словом async. Асинхронный генератор позволяет выполнять асинхронные операции и производить значения с задержкой, а в случае необходимости, продолжать генерацию новых значений после завершения асинхронной операции.

Чтобы создать асинхронный генератор, нужно объявить функцию-генератор с ключевым словом async и использовать ключевое слово yield вместе с асинхронным оператором, таким как await. Когда yield достигает оператора await, генератор приостанавливает свою работу и возвращает значение, которое вместе с результатом операции await будет использовано внешним кодом.

Приведу пример кода для более наглядного объяснения:

async function* asyncGenerator() {
  let i = 0;
  while (true) {
    await new Promise(resolve => setTimeout(resolve, 1000)); // асинхронная операция
    yield i++;
  }
}

// Использование асинхронного генератора
(async () => {
  for await (const num of asyncGenerator()) {
    console.log(num);
  }
})();

В этом примере мы создали функцию-генератор asyncGenerator, которая бесконечно генерирует числа, с задержкой в одну секунду между каждым числом. Внешний код использует for await...of цикл для итерации по значениям, которые генерирует асинхронный генератор. В этом случае, каждое число будет выводиться в консоль с интервалом в одну секунду.

Важно отметить, что использование асинхронных генераторов требует поддержки окружением выполнения (браузером или средой Node.js) современных стандартов JavaScript, таких как ECMAScript 2018. Если окружение не поддерживает конструкцию async/await, альтернативным подходом может быть использование промисов и рекурсивных вызовов функций вместо генератора.