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

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

 

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

AsyncFunctionDeclaration [Yield, Await, Default] :

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

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

AsyncFunctionExpression :

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

AsyncMethod [Yield, Await] :

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

AsyncFunctionBody :

FunctionBody [~Yield, +Await]

AwaitExpression [Yield] :

await UnaryExpression [?Yield, +Await]

 

Примечание 1

await анализируется как AwaitExpression, когда присутствует параметр [Await]. Параметр [Await] присутствует в следующих контекстах:

Когда Module является синтаксическим символом цели и параметр [Await] отсутствует, await анализируется как ключевое слово и представляет собой синтаксическую ошибку. Когда Script является синтаксическим символом цели, await может быть проанализировано как идентификатор, когда параметр [Await] отсутствует. Это включает в себя следующие контексты:

 

Примечание 2

В отличие от YieldExpression опускание операнда AwaitExpression является синтаксической ошибкой. Вы должны чего-то подождать.

 

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

AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }

AsyncFunctionDeclaration :

async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }

async function ( FormalParameters ) { AsyncFunctionBody }

AsyncFunctionExpression :

async function BindingIdentifier opt ( FormalParameters ) { AsyncFunctionBody }

 

Семантика среды выполнения: Создание Экземпляра Объекта Асинхронной Функции — InstantiateAsyncFunctionObject

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

AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }

1. Пусть имя name будет StringValue для BindingIdentifier.
2. Пусть sourceText будет исходным текстом, совпадающим с AsyncFunctionDeclaration.
3. Пусть F будет ! OrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, scope, privateScope).
4. Выполнить ! SetFunctionName(F, name).
5. Верните F.

AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }

1. Пусть sourceText будет исходным текстом, совпадающим с AsyncFunctionDeclaration.
2. Пусть F будет ! OrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, scope, privateScope).
3. Выполнить ! SetFunctionName(F, "default").
4. Верните F.

 

Семантика среды выполнения: Выражение Создания Экземпляра Асинхронной функции — InstantiateAsyncFunctionExpression

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

AsyncFunctionExpression : async function FormalParameters ) { AsyncFunctionBody }

1. Если имя name не указано, установите для имени name значение "".
2. Пусть область видимости scope будет LexicalEnvironment текущего контекста выполнения.
3. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
4. Пусть sourceText будет исходным текстом, совпадающим с AsyncFunctionExpression.
5. Пусть замыкание closure будет ! OrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, scope, privateScope).
6. Выполните SetFunctionName(closure, name).
7. Верните замыкание closure.

AsyncFunctionExpression : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }

1. Утверждено: имя name не указано.
2. Задайте для имя name строковое значение StringValue из BindingIdentifier.
3. Пусть область видимости scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть funcEnv будет ! NewDeclarativeEnvironment(scope).
5. Выполнить ! funcEnv.CreateImmutableBinding(name, false).
6. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
7. Пусть sourceText будет исходным текстом, совпадающим с AsyncFunctionExpression.
8. Пусть замыкание closure будет ! OrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, funcEnv, privateScope).
9. Выполните! SetFunctionName(closure, name).
10. Выполнить ! funcEnv.InitializeBinding (name, closure).
11. Верните замыкание closure.
Примечание

На BindingIdentifier в AsyncFunctionExpression можно ссылаться изнутри AsyncFunctionBody AsyncFunctionExpression, чтобы функция могла вызывать себя рекурсивно. Однако, в отличие от FunctionDeclaration, на BindingIdentifier в AsyncFunctionExpression нельзя ссылаться, и это не влияет на область, содержащую AsyncFunctionExpression.

 

Семантика среды выполнения: Оценить Тело Асинхронной Функции — EvaluateAsyncFunctionBody

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

AsyncFunctionBody : FunctionBody

1. Пусть promiseCapability будет! NewPromiseCapability(%Promise%).
2. Пусть declResult будет FunctionDeclarationInstantiation(functionObject, argumentsList).
3. Если declResult не является внезапным завершением, тогда
   а. Выполнить ! AsyncFunctionStart(promiseCapability, FunctionBody).
4. Иначе,
   а. Выполнить ! Вызов Call(promCapability.[[Reject]], undefined, «declResult.[[Value]]»).
5. Вернуть завершение Completion {[[Type]]: return, [[Value]]: promCapability.[[Promise]], [[Target]]: empty }.

 

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

AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }

1. Вернуть NormalCompletion(empty).

AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }

1. Вернуть NormalCompletion(empty).

AsyncFunctionExpression :

async function BindingIdentifier opt ( FormalParameters ) { AsyncFunctionBody }

1. Вернуть InstantiateAsyncFunctionExpression из AsyncFunctionExpression.

AwaitExpression : await UnaryExpression

1. Пусть exprRef будет результатом вычисления UnaryExpression.
2. Пусть value будет ? GetValue(exprRef).
3. Вернуть ? Await(value).

 

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

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