Синтаксис Определения Асинхронных Функций
AsyncFunctionDeclaration [Yield, Await, Default] :
async [не LineTerminator здесь] function BindingIdentifier [?Yield, ?Await] ( FormalParameters [~Yield, +Await] ) { AsyncFunctionBody }
[+Default] async [не LineTerminator здесь] function ( FormalParameters [~Yield, +Await] ) { AsyncFunctionBody }
async [не LineTerminator здесь] function BindingIdentifier [~Yield, +Await] opt ( FormalParameters [~Yield, +Await] ) { AsyncFunctionBody }
AsyncMethod [Yield, Await] :
async [не LineTerminator здесь] ClassElementName [?Yield, ?Await] ( UniqueFormalParameters [~Yield, +Await] ) { AsyncFunctionBody }
FunctionBody [~Yield, +Await]
AwaitExpression [Yield] :
await UnaryExpression [?Yield, +Await]
await анализируется как AwaitExpression, когда присутствует параметр [Await]. Параметр [Await] присутствует в следующих контекстах:
- В AsyncFunctionBody.
- В FormalParameters из AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration или AsyncGeneratorExpression. AwaitExpression в этой позиции является синтаксической ошибкой из-за статической семантики.
Когда Module является синтаксическим символом цели и параметр [Await] отсутствует, await анализируется как ключевое слово и представляет собой синтаксическую ошибку. Когда Script является синтаксическим символом цели, await может быть проанализировано как идентификатор, когда параметр [Await] отсутствует. Это включает в себя следующие контексты:
- В любом месте за пределами AsyncFunctionBody или FormalParameters из AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration или AsyncGeneratorExpression.
- В BindingIdentifier из FunctionExpression, GeneratorExpression или AsyncGeneratorExpression.
В отличие от YieldExpression опускание операнда AwaitExpression является синтаксической ошибкой. Вы должны чего-то подождать.
Статическая семантика: Ранние Ошибки — Early Errors
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
- Это синтаксическая ошибка, если FunctionBodyContainsUseStrict для AsyncFunctionBody имеет значение true (истинно), а IsSimpleParameterList для UniqueFormalParameters — false.
- Это синтаксическая ошибка, если HasDirectSuper для AsyncMethod является true (истинно).
- Это синтаксическая ошибка, если UniqueFormalParameters Содержат AwaitExpression является true (истинно).
- Это синтаксическая ошибка, если какой-либо элемент BoundNames в UniqueFormalParameters также встречается в LexicallyDeclaredNames в AsyncFunctionBody.
async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
async function ( FormalParameters ) { AsyncFunctionBody }
async function BindingIdentifier opt ( FormalParameters ) { AsyncFunctionBody }
- Это синтаксическая ошибка, если FunctionBodyContainsUseStrict для AsyncFunctionBody является true (истинно), а IsSimpleParameterList для FormalParameters — false.
- Это синтаксическая ошибка, если FormalParameters Содержат AwaitExpression является true (истинно).
- Если исходный код, соответствующий FormalParameters, является кодом строгого режима, применяются правила Early Error для UniqueFormalParameters : FormalParameters.
- Если BindingIdentifier присутствует и исходный код, соответствующий BindingIdentifier, является кодом в строгом режиме, это является синтаксической ошибкой, если StringValue для BindingIdentifier имеет значение «eval» или «arguments».
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из FormalParameters также встречается в LexicallyDeclaredNames в AsyncFunctionBody.
- Это синтаксическая ошибка, если FormalParameters Содержат SuperProperty является true (истинно).
- Это синтаксическая ошибка, если AsyncFunctionBody Содержат SuperProperty является true (истинно).
- Это синтаксическая ошибка, если FormalParameters Содержат SuperCall является true (истинно).
- Это синтаксическая ошибка, если AsyncFunctionBody Содержат SuperCall является true (истинно).
Семантика среды выполнения: Создание Экземпляра Объекта Асинхронной Функции — 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).
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