Понимание разницы между «async» и «async*» в JavaScript

В JavaScript асинхронное программирование является важной концепцией для выполнения трудоемких операций без блокировки выполнения другого кода. В асинхронном коде обычно используются два ключевых слова: «async» и «async*». В этой статье мы рассмотрим разницу между этими двумя ключевыми словами и приведем примеры кода, иллюстрирующие их использование.

Асинхронные функции.
Ключевое слово «async» используется для определения асинхронной функции. Асинхронная функция всегда возвращает обещание, что позволяет нам использовать ключевое слово «await» в теле функции для более синхронной обработки асинхронных операций. Вот пример:

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Error:', error);
    throw error;
  }
}

В приведенном выше примере функция fetchDataпомечена как async, что указывает на то, что она возвращает обещание. Ключевое слово awaitиспользуется для приостановки выполнения функции до тех пор, пока обещание не будет разрешено или отклонено. Это позволяет нам писать более чистый и читаемый асинхронный код.

Асинхронные итераторы.
Ключевое слово «async*», также известное как «асинхронные генераторы», представляет собой расширенную функцию, представленную в ECMAScript 2021. Оно используется для определения асинхронных генераторов, то есть функций, которые могут генерировать последовательность значения асинхронно. Вот пример:

async function* generateData() {
  try {
    const response = await fetch('https://api.example.com/stream');
    const reader = response.body.getReader();

    while (true) {
      const { done, value } = await reader.read();

      if (done) {
        break;
      }

      yield value;
    }
  } catch (error) {
    console.error('Error:', error);
    throw error;
  }
}

В приведенном выше примере функция generateDataопределена как генератор asyncс использованием синтаксиса async*. Он использует ключевое слово yieldдля асинхронной генерации значений, что позволяет нам перебирать потенциально бесконечную последовательность значений.

Короче говоря, ключевое слово «async» используется для определения асинхронных функций, возвращающих обещания, а ключевое слово «async*» используется для определения асинхронных генераторов. Понимание разницы между этими двумя ключевыми словами имеет решающее значение для написания эффективного и удобного в обслуживании асинхронного кода на JavaScript.

Используя ключевое слово «async», мы можем писать более чистый и читаемый код, используя ключевое слово «await» для обработки асинхронных операций. С другой стороны, ключевое слово «async*» позволяет нам определить асинхронные генераторы, которые могут генерировать последовательность значений асинхронно.

Асинхронное программирование – это мощный метод JavaScript, и знание этих ключевых слов позволит вам писать более эффективные и отзывчивые приложения.