Spec-Zone.ru › JavaScript

async function*

Baseline Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с января 2020 года.

Объявление async function* создает привязку новой асинхронной генераторной функции к заданному имени.

Вы также можете определить асинхронные генераторные функции, используя выражение async function*.

Попробуйте

async function* foo() {
  yield await Promise.resolve("a");
  yield await Promise.resolve("b");
  yield await Promise.resolve("c");
}

let str = "";

async function generate() {
  for await (const val of foo()) {
    str += val;
  }
  console.log(str);
}

generate();
// Expected output: "abc"

Синтаксис

async function* name(param0) {
  statements
}
async function* name(param0, param1) {
  statements
}
async function* name(param0, param1, /* …, */ paramN) {
  statements
}

Примечание: Асинхронные генераторные функции не имеют аналогов в виде стрелочных функций.

Примечание: function и * являются отдельными токенами, поэтому их можно разделять пробельными символами или терминаторами строк. Однако между async и function не может быть терминатора строки, иначе будет автоматически вставлена точка с запятой, в результате чего async станет идентификатором, а остальная часть — объявлением function*.

Параметры

name
Имя функции.
param Необязательно
Имя формального параметра функции. Синтаксис параметров см. в справке по функциям.
statements Необязательно
Инструкции, составляющие тело функции.

Описание

Объявление async function* создает объект AsyncGeneratorFunction. Каждый раз, когда вызывается асинхронная генераторная функция, она возвращает новый объект AsyncGenerator, который соответствует протоколу асинхронного итератора. Каждый вызов next() возвращает Promise, который разрешается объектом результата итератора.

Асинхронная генераторная функция сочетает в себе возможности асинхронных функций и генераторных функций. Вы можете использовать ключевые слова await и yield в теле функции. Это позволяет эргономично обрабатывать асинхронные задачи с помощью await, используя ленивую природу генераторных функций.

Когда из асинхронного генератора выдается промис, конечное состояние промиса результата итератора будет соответствовать состоянию выданного промиса. Например:

async function* foo() {
  yield Promise.reject(new Error("failed"));
}

foo()
  .next()
  .catch((e) => console.error(e));

будет выведено Error: failed, поскольку если выданный промис отклоняется, результат итератора также отклонится. Свойство value результата, полученного при разрешении асинхронного генератора, не будет другим промисом.

Объявления async function* ведут себя аналогично объявлениям function — они переносятся в начало своей области видимости и могут быть вызваны в любом месте своей области видимости, а повторно объявлять их можно только в определенных контекстах.

Примеры

Объявление асинхронной генераторной функции

Асинхронные генераторные функции всегда производят промисы результатов — даже когда каждый шаг yield является синхронным.

async function* myGenerator(step) {
  await new Promise((resolve) => setTimeout(resolve, 10));
  yield 0;
  yield step;
  yield step * 2;
}

const gen = myGenerator(2);
gen
  .next()
  .then((res) => {
    console.log(res); // { value: 0, done: false }
    return gen.next();
  })
  .then((res) => {
    console.log(res); // { value: 2, done: false }
    return gen.next();
  })
  .then((res) => {
    console.log(res); // { value: 4, done: false }
    return gen.next();
  })
  .then((res) => {
    console.log(res); // { value: undefined, done: true }
    return gen.next();
  });

Использование асинхронной генераторной функции для чтения серии файлов

В этом примере мы читаем серию файлов и получаем доступ к их содержимому только по запросу, используя модуль Node.js fs/promises.

async function* readFiles(directory) {
  const files = await fs.readdir(directory);
  for (const file of files) {
    const stats = await fs.stat(file);
    if (stats.isFile()) {
      yield {
        name: file,
        content: await fs.readFile(file, "utf8"),
      };
    }
  }
}

const files = readFiles(".");
console.log((await files.next()).value);
// Possible output: { name: 'file1.txt', content: '...' }
console.log((await files.next()).value);
// Possible output: { name: 'file2.txt', content: '...' }

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-async-generator-function-definitions

Совместимость с браузерами

Настольные компьютеры Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
async_generator_function
63
79
57
50
12
63
57
46
12
8.0
63
12
1.0.0
1.0
10.0.0

См. также

  • Руководство по функциям
  • Руководство по итераторам и генераторам
  • Функции
  • AsyncGeneratorFunction
  • выражение async function*
  • function
  • function*
  • async function
  • Протоколы итерации
  • yield
  • yield*
  • AsyncGenerator

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function*

Spec-Zone.ru

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