ECMAScript | Определения Функций Асинхронного Генератора (Async Generator Function Definitions)

ECMAScript | Определения Функций Асинхронного Генератора (Async Generator Function Definitions)

Синтаксис Определения Функций Асинхронного Генератора

AsyncGeneratorMethod [Yield, Await] :

async [не LineTerminator здесь] * ClassElementName [?Yield, ?Await] ( UniqueFormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }

AsyncGeneratorDeclaration [Yield, Await, Default] :

async [не LineTerminator здесь] function * BindingIdentifier [?Yield, ?Await] ( FormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }

[+Default] async [не LineTerminator здесь] function * ( FormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }

AsyncGeneratorExpression :

async [не LineTerminator здесь] function * BindingIdentifier [+Yield, +Await] opt ( FormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }

AsyncGeneratorBody :

FunctionBody [+Yield, +Await]

 

Примечание 1

YieldExpression и AwaitExpression нельзя использовать в FormalParameters функции асинхронного генератора, потому что любые выражения, которые являются частью FormalParameters, оцениваются до того, как результирующий объект асинхронного генератора перейдет в возобновляемое состояние.

 

Примечание 2

Абстрактные операции, относящиеся к объектам асинхронного генератора, определены в разделе 27.6.3.

 

Статическая семантика: РанниеОшибки — Early Errors

AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }

AsyncGeneratorDeclaration :

async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }

async function * ( FormalParameters ) { AsyncGeneratorBody }

AsyncGeneratorExpression :

async function * BindingIdentifier opt ( FormalParameters ) { AsyncGeneratorBody }

 

Семантика среды выполнения: Оценить Тело Асинхронного Генератора — EvaluateAsyncGeneratorBody

С параметрами functionObject и argumentsList (Список).

AsyncGeneratorBody : FunctionBody

1. Выполнить ? FunctionDeclarationInstantiation(functionObject, argumentsList).
2. Пусть генератор generator будет ? OrdinaryCreateFromConstructor(functionObject, "%AsyncGeneratorFunction.prototype.prototype%", «[[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]]»).
3. Установите generator.[[GeneratorBrand]] на empty (пустой).
4. Выполнить ! AsyncGeneratorStart(generator, FunctionBody).
5. Вернуть Completion { [[Type]]: return, [[Value]]: generator, [[Target]]: empty }.

 

Семантика среды выполнения: Создание экземпляра функционального объекта асинхронного генератора — InstantiateAsyncGeneratorFunctionObject

С параметрами scope и privateScope.

AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }

1. Пусть имя name будет строковым значением StringValue для BindingIdentifier.
2. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorDeclaration.
3. Пусть F будет! OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, scope, privateScope).
4. Выполнить ! SetFunctionName(F, name).
5. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%).
6. Выполнить ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ".
7. Вернуть F.

AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }

1. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorDeclaration.
2. Пусть F будет OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, scope, privateScope).
3. Выполните SetFunctionName(F, "default").
4. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%).
5. Выполните DefinePropertyOrThrow(F, "prototype", PropertyDescriptor {[[Значение]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}).
6. Верните F.
Примечание

Анонимное объявление AsyncGeneratorDeclaration может происходить только как часть объявления export default (экспорта по умолчанию).

 

Семантика среды выполнения: Создание экземпляра выражения функции асинхронного генератора — InstantiateAsyncGeneratorFunctionExpression

С необязательным параметром name.

AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }

1. Если имя name отсутствует, установите для имени name значение "".
2. Пусть область видимости scope будет LexicalEnvironment текущего контекста выполнения.
3. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
4. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorExpression.
5. Пусть закрытие closure будет ! OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, scope, privateScope).
6. Выполните SetFunctionName(closure, name).
7. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%).
8. Выполнить ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ».
9. Вернуть closure.

AsyncGeneratorExpression : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }

1. Утверждено: имя name не представлено.
2. Установите для имени name строковое значение StringValue для BindingIdentifier.
3. Пусть область видимости scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть funcEnv будет ! NewDeclarativeEnvironment(scope).
5. Выполнить ! funcEnv.CreateImmutableBinding(name, false).
6. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
7. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorExpression.
8. Пусть закрытие closure будет ! OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, funcEnv, privateScope).
9. Выполнить ! SetFunctionName(closure, name).
10. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%).
11. Выполняйте ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ».
12. Выполнить ! funcEnv.InitializeBinding(name, closure).
13. Вернуть closure.
Примечание

На BindingIdentifier в AsyncGeneratorExpression можно ссылаться изнутри AsyncGeneratorBody AsyncGeneratorExpression, чтобы код генератора мог вызывать себя рекурсивно. Однако, в отличие от AsyncGeneratorDeclaration, на BindingIdentifier в AsyncGeneratorExpression нельзя ссылаться, и это не влияет на область, содержащую AsyncGeneratorExpression.

 

Семантика времени выполнения: Оценка — Evaluation

AsyncGeneratorExpression : async function * BindingIdentifier opt ( FormalParameters ) { AsyncGeneratorBody }

1. Вернуть InstantiateAsyncGeneratorFunctionExpression из AsyncGeneratorExpression.

 

 

Информационные ссылки

Стандарт ECMAScript — Раздел «15.6 Async Generator Function Definitions» — https://tc39.es/ecma262/#sec-async-generator-function-definitions