AsyncGenerator
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с января 2020 года.
Объект AsyncGenerator возвращается асинхронной функцией-генератором и соответствует как протоколу асинхронного итерирования, так и протоколу асинхронного итератора.
Методы асинхронного генератора всегда возвращают (yield) объекты Promise.
AsyncGenerator является подклассом скрытого класса AsyncIterator.
Конструктор
Не существует сущности JavaScript, которая соответствовала бы конструктору AsyncGenerator. Экземпляры AsyncGenerator должны быть возвращены из асинхронных функций-генераторов:
async function* createAsyncGenerator() {
yield Promise.resolve(1);
yield await Promise.resolve(2);
yield 3;
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res.value)); // 1
asyncGen.next().then((res) => console.log(res.value)); // 2
asyncGen.next().then((res) => console.log(res.value)); // 3
Существует только скрытый объект, который является объектом-прототипом, общим для всех объектов, созданных асинхронными функциями-генераторами. Этот объект часто стилизуют как AsyncGenerator.prototype, чтобы он выглядел как класс, но его более уместно называть AsyncGeneratorFunction.prototype.prototype, поскольку AsyncGeneratorFunction является фактической сущностью JavaScript. Чтобы понять цепочку прототипов экземпляров AsyncGenerator, см. AsyncGeneratorFunction.prototype.prototype.
Свойства экземпляра
Эти свойства определены в AsyncGenerator.prototype и являются общими для всех экземпляров AsyncGenerator.
-
AsyncGenerator.prototype.constructor -
Функция-конструктор, создавшая объект экземпляра. Для экземпляров
AsyncGeneratorначальным значением являетсяAsyncGeneratorFunction.prototype.Примечание: Объекты
AsyncGeneratorне хранят ссылку на асинхронную функцию-генератор, которая их создала. -
AsyncGenerator.prototype[Symbol.toStringTag] - Начальным значением свойства
[Symbol.toStringTag]является строка"AsyncGenerator". Это свойство используется вObject.prototype.toString().
Методы экземпляра
Также наследует методы экземпляра от своего родительского объекта AsyncIterator.
-
AsyncGenerator.prototype.next() - Возвращает
Promise, который будет разрешен с заданным значением, возвращенным (yielded) выражениемyield. -
AsyncGenerator.prototype.return() - Действует так, как если бы оператор
returnбыл вставлен в тело генератора в текущей приостановленной позиции, что завершает работу генератора и позволяет ему выполнять любые задачи очистки в сочетании с блокомtry...finally. -
AsyncGenerator.prototype.throw() - Действует так, как если бы оператор
throwбыл вставлен в тело генератора в текущей приостановленной позиции, что информирует генератор об условии ошибки и позволяет ему обработать ошибку, выполнить очистку или закрыть себя.
Примеры
Итерирование асинхронного генератора
Следующий пример выполняет итерацию по асинхронному генератору, выводя значения 1–6 в консоль с уменьшающимися временными интервалами. Обратите внимание, как каждый раз генерируется Promise (обещание), который автоматически разрешается внутри цикла for await...of.
// An async task. Pretend it's doing something more useful
// in practice.
function delayedValue(time, value) {
return new Promise((resolve /*, reject */) => {
setTimeout(() => resolve(value), time);
});
}
async function* generate() {
yield delayedValue(2000, 1);
yield delayedValue(1000, 2);
yield delayedValue(500, 3);
yield delayedValue(250, 4);
yield delayedValue(125, 5);
yield delayedValue(50, 6);
console.log("All done!");
}
async function main() {
for await (const value of generate()) {
console.log("value", value);
}
}
main().catch((e) => console.error(e));
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
AsyncGenerator |
63 |
79 |
55 |
50 |
12 |
63 |
55 |
46 |
12 |
8.0 |
63 |
12 |
1.0.0 |
1.0 |
10.0.0 |
next |
63 |
79 |
55 |
50 |
12 |
63 |
55 |
46 |
12 |
8.0 |
63 |
12 |
1.0.0 |
1.0 |
10.0.0 |
return |
63 |
79 |
55 |
50 |
12 |
63 |
55 |
46 |
12 |
8.0 |
63 |
12 |
1.0.0 |
1.0 |
10.0.0 |
throw |
63 |
79 |
55 |
50 |
12 |
63 |
55 |
46 |
12 |
8.0 |
63 |
12 |
1.0.0 |
1.0 |
10.0.0 |
Смотрите также
- function*
- async function*
function*expression- Функция-генератор
- Асинхронная функция-генератор
- Руководство по итераторам и генераторам
© 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/Global_Objects/AsyncGenerator